[UPMERGE] 2.3 -> symfony-8 (#19069)

This PR has been generated automatically.
For more details see
[upmerge_pr.yaml](/Sylius/Sylius/blob/2.3/.github/workflows/upmerge_pr.yaml).

**Remember!** The upmerge should always be merged with using `Merge pull
request` button.

In case of conflicts, please resolve them manually with usign the
following commands:
```
git fetch upstream
gh pr checkout <this-pr-number>
git merge upstream/symfony-8 -m "Resolve conflicts between 2.3 and symfony-8"
```

If you use other name for the upstream remote, please replace `upstream`
with the name of your remote pointing to the `Sylius/Sylius` repository.

Once the conflicts are resolved, please run `git merge --continue` and
push the changes to this PR.
This commit is contained in:
Grzegorz Sadowski 2026-06-19 10:27:18 +02:00 committed by GitHub
commit 88b2a49867
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
738 changed files with 8650 additions and 2205 deletions

1
.gitattributes vendored
View file

@ -34,7 +34,6 @@ phpstan.neon.dist export-ignore
phpstan-baseline.neon export-ignore
phpunit.xml.dist export-ignore
rector.php export-ignore
RoboFile.php export-ignore
symfony.lock export-ignore
webpack.config.js export-ignore
yaml-standards.yaml export-ignore

View file

@ -1,6 +1,6 @@
| Q | A
|-----------------|-----
| Branch? | 1.14, 2.0 or 2.1 <!-- see the comment below -->
| Branch? | 2.2 or 2.3 <!-- see the comment below -->
| Bug fix? | no/yes
| New feature? | no/yes
| BC breaks? | no/yes
@ -9,8 +9,8 @@
| License | MIT
<!--
- Bug fixes must be submitted against the 1.14 or 2.1 branch
- Features and deprecations must be submitted against the 2.2 branch
- Bug fixes must be submitted against the 2.2 branch
- Features and deprecations must be submitted against the 2.3 branch
- Make sure that the correct base branch is set
To be sure you are not breaking any Backward Compatibilities, check the documentation:

View file

@ -1,4 +1,4 @@
name: Continuous Integration 2.2 (Full)
name: Continuous Integration (Full)
on:
push:
@ -10,17 +10,17 @@ on:
workflow_dispatch: ~
concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}-2_0-full
group: ci-${{ github.workflow }}-${{ github.ref }}-full
cancel-in-progress: true
permissions:
permissions:
contents: read
jobs:
static-checks:
strategy:
matrix:
branch: ["2.2"]
branch: ["2.2", "2.3"]
name: "[${{ matrix.branch }}] Static checks"
uses: ./.github/workflows/ci_static-checks.yaml
with:
@ -29,7 +29,7 @@ jobs:
e2e-mariadb:
strategy:
matrix:
branch: ["2.2"]
branch: ["2.2", "2.3"]
name: "[${{ matrix.branch }}] Tests (MariaDB)"
needs: static-checks
uses: ./.github/workflows/ci_e2e-mariadb.yaml
@ -39,7 +39,7 @@ jobs:
e2e-mysql:
strategy:
matrix:
branch: ["2.2"]
branch: ["2.2", "2.3"]
name: "[${{ matrix.branch }}] Tests (MySQL)"
needs: static-checks
uses: ./.github/workflows/ci_e2e-mysql.yaml
@ -49,7 +49,7 @@ jobs:
e2e-pgsql:
strategy:
matrix:
branch: ["2.2"]
branch: ["2.2", "2.3"]
name: "[${{ matrix.branch }}] Tests (PostgreSQL)"
needs: static-checks
uses: ./.github/workflows/ci_e2e-pgsql.yaml
@ -59,7 +59,7 @@ jobs:
e2e-js:
strategy:
matrix:
branch: ["2.2"]
branch: ["2.2", "2.3"]
name: "[${{ matrix.branch }}] Javascript Tests (MySQL)"
needs: static-checks
uses: ./.github/workflows/ci_js.yaml
@ -67,7 +67,10 @@ jobs:
branch: ${{ matrix.branch }}
type: full
frontend:
name: Frontend
strategy:
matrix:
branch: ["2.2", "2.3"]
name: "[${{ matrix.branch }}] Frontend"
needs: static-checks
uses: ./.github/workflows/ci_frontend.yaml
with:
@ -76,7 +79,7 @@ jobs:
packages:
strategy:
matrix:
branch: ["2.2"]
branch: ["2.2", "2.3"]
name: "[${{ matrix.branch }}] Packages"
needs: static-checks
uses: ./.github/workflows/ci_packages.yaml

View file

@ -1,118 +0,0 @@
name: Continuous Integration 1.14 (Full)
on:
push:
branches:
- 'full-ci/**'
schedule:
-
cron: "0 1 * * *" # Run every day at 1am
workflow_dispatch: ~
concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}-1_14-full
cancel-in-progress: true
permissions:
contents: read
jobs:
static-checks:
strategy:
matrix:
branch: ["1.14"]
name: "[${{ matrix.branch }}] Static checks"
uses: ./.github/workflows/ci_static-checks.yaml
with:
branch: ${{ matrix.branch }}
type: full
e2e-mariadb:
strategy:
matrix:
branch: ["1.14"]
name: "[${{ matrix.branch }}] End-to-end tests (MariaDB)"
needs: static-checks
uses: ./.github/workflows/ci_e2e-mariadb.yaml
with:
branch: ${{ matrix.branch }}
type: full
e2e-mysql:
strategy:
matrix:
branch: ["1.14"]
name: "[${{ matrix.branch }}] End-to-end tests (MySQL)"
needs: static-checks
uses: ./.github/workflows/ci_e2e-mysql.yaml
with:
branch: ${{ matrix.branch }}
type: full
e2e-pgsql:
strategy:
matrix:
branch: ["1.14"]
name: "[${{ matrix.branch }}] End-to-end tests (PostgreSQL)"
needs: static-checks
uses: ./.github/workflows/ci_e2e-pgsql.yaml
with:
branch: ${{ matrix.branch }}
type: full
frontend:
name: Frontend
needs: static-checks
uses: ./.github/workflows/ci_frontend.yaml
with:
branch: ${{ matrix.branch }}
type: full
packages:
strategy:
matrix:
branch: ["1.14"]
name: "[${{ matrix.branch }}] Packages"
needs: static-checks
uses: ./.github/workflows/ci_packages.yaml
with:
branch: ${{ matrix.branch }}
type: full
notify-about-build-status:
if: ${{ always() }}
name: "Notify about build status"
needs: [static-checks, e2e-mariadb, e2e-mysql, e2e-pgsql, frontend, packages]
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: "Process data"
id: process-data
shell: bash
run: |
echo "branch=$(echo ${{ github.ref }} | sed 's/refs\/heads\///g' | sed 's/refs\/tags\///g')" >> $GITHUB_OUTPUT
echo "sha=$(echo ${{ github.sha }} | cut -c 1-12)" >> $GITHUB_OUTPUT
- name: "Notify on Slack"
uses: edge/simple-slack-notify@master
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
if: env.SLACK_WEBHOOK_URL != null
with:
channel: "#daily-build"
username: "GitHub Actions"
text: |
*<https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} | ${{ github.workflow }} #${{ github.run_number }} build on ${{ github.repository }} repository has been completed for ${{ steps.process-data.outputs.branch }} branch.>*
${{ needs.static-checks.result == 'success' && ':+1:' || ':x:' }} Static Checks
${{ needs.e2e-mariadb.result == 'success' && ':+1:' || ':x:' }} End-to-End (MariaDB)
${{ needs.e2e-mysql.result == 'success' && ':+1:' || ':x:' }} End-to-End (MySQL)
${{ needs.e2e-pgsql.result == 'success' && ':+1:' || ':x:' }} End-to-End (PostgreSQL)
${{ needs.frontend.result == 'success' && ':+1:' || ':x:' }} Frontend
${{ needs.packages.result == 'success' && ':+1:' || ':x:' }} Packages
_ _ _ _ _ _ _
color: "danger"
fields: |
[
{ "title": "Repository", "value": "<https://github.com/${{ github.repository }} | ${{ github.repository }}>", "short": true },
{ "title": "Action", "value": "<https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} | ${{ github.workflow }} #${{ github.run_number }}>", "short": true },
{ "title": "Reference", "value": "<https://github.com/${{ github.repository }}/tree/${{ steps.process-data.outputs.branch }} | ${{ steps.process-data.outputs.branch }}>", "short": true },
{ "title": "Commit", "value": "<https://github.com/${{ github.repository }}/commit/${{ github.sha }} | ${{ steps.process-data.outputs.sha }}>", "short": true },
{ "title": "Event", "value": "${{ github.event_name }}", "short": true }
]

View file

@ -1,129 +0,0 @@
name: Continuous Integration 2.1 (Full)
on:
push:
branches:
- 'full-ci/**'
schedule:
-
cron: "0 2 * * *" # Run every day at 2am
workflow_dispatch: ~
concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}-2_1-full
cancel-in-progress: true
permissions:
contents: read
jobs:
static-checks:
strategy:
matrix:
branch: ["2.1"]
name: "[${{ matrix.branch }}] Static checks"
uses: ./.github/workflows/ci_static-checks.yaml
with:
branch: ${{ matrix.branch }}
type: full
e2e-mariadb:
strategy:
matrix:
branch: ["2.1"]
name: "[${{ matrix.branch }}] Tests (MariaDB)"
needs: static-checks
uses: ./.github/workflows/ci_e2e-mariadb.yaml
with:
branch: ${{ matrix.branch }}
type: full
e2e-mysql:
strategy:
matrix:
branch: ["2.1"]
name: "[${{ matrix.branch }}] Tests (MySQL)"
needs: static-checks
uses: ./.github/workflows/ci_e2e-mysql.yaml
with:
branch: ${{ matrix.branch }}
type: full
e2e-pgsql:
strategy:
matrix:
branch: ["2.1"]
name: "[${{ matrix.branch }}] Tests (PostgreSQL)"
needs: static-checks
uses: ./.github/workflows/ci_e2e-pgsql.yaml
with:
branch: ${{ matrix.branch }}
type: full
e2e-js:
strategy:
matrix:
branch: ["2.1"]
name: "[${{ matrix.branch }}] Javascript Tests (MySQL)"
needs: static-checks
uses: ./.github/workflows/ci_js.yaml
with:
branch: ${{ matrix.branch }}
type: full
frontend:
name: Frontend
needs: static-checks
uses: ./.github/workflows/ci_frontend.yaml
with:
branch: ${{ matrix.branch }}
type: full
packages:
strategy:
matrix:
branch: ["2.1"]
name: "[${{ matrix.branch }}] Packages"
needs: static-checks
uses: ./.github/workflows/ci_packages.yaml
with:
branch: ${{ matrix.branch }}
type: full
notify-about-build-status:
if: ${{ always() }}
name: "Notify about build status"
needs: [static-checks, e2e-mariadb, e2e-mysql, e2e-pgsql, e2e-js, frontend, packages]
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: "Process data"
id: process-data
shell: bash
run: |
echo "branch=$(echo ${{ github.ref }} | sed 's/refs\/heads\///g' | sed 's/refs\/tags\///g')" >> $GITHUB_OUTPUT
echo "sha=$(echo ${{ github.sha }} | cut -c 1-12)" >> $GITHUB_OUTPUT
- name: "Notify on Slack"
uses: edge/simple-slack-notify@master
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
if: env.SLACK_WEBHOOK_URL != null
with:
channel: "#daily-build"
username: "GitHub Actions"
text: |
*<https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} | ${{ github.workflow }} #${{ github.run_number }} build on ${{ github.repository }} repository has been completed for ${{ steps.process-data.outputs.branch }} branch.>*
${{ needs.static-checks.result == 'success' && ':+1:' || ':x:' }} Static Checks
${{ needs.e2e-mariadb.result == 'success' && ':+1:' || ':x:' }} Tests (MariaDB)
${{ needs.e2e-mysql.result == 'success' && ':+1:' || ':x:' }} Tests (MySQL)
${{ needs.e2e-pgsql.result == 'success' && ':+1:' || ':x:' }} Tests (PostgreSQL)
${{ needs.e2e-js.result == 'success' && ':+1:' || ':x:' }} Javascript Tests (MySQL)
${{ needs.frontend.result == 'success' && ':+1:' || ':x:' }} Frontend
${{ needs.packages.result == 'success' && ':+1:' || ':x:' }} Packages
_ _ _ _ _ _ _
color: "danger"
fields: |
[
{ "title": "Repository", "value": "<https://github.com/${{ github.repository }} | ${{ github.repository }}>", "short": true },
{ "title": "Action", "value": "<https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} | ${{ github.workflow }} #${{ github.run_number }}>", "short": true },
{ "title": "Reference", "value": "<https://github.com/${{ github.repository }}/tree/${{ steps.process-data.outputs.branch }} | ${{ steps.process-data.outputs.branch }}>", "short": true },
{ "title": "Commit", "value": "<https://github.com/${{ github.repository }}/commit/${{ github.sha }} | ${{ steps.process-data.outputs.sha }}>", "short": true },
{ "title": "Event", "value": "${{ github.event_name }}", "short": true }
]

View file

@ -22,3 +22,4 @@ jobs:
uses: ./.github/workflows/ci_packages-unstable.yaml
with:
type: minimal
ignore-failure: true

View file

@ -57,17 +57,6 @@ jobs:
BEHAT_RERUN_CMD: "vendor/bin/behat --colors --strict --no-interaction -vvv -f pretty --rerun"
steps:
- name: Set variables
shell: bash
env:
BRANCH: ${{ inputs.branch }}
run: |
if [ "$BRANCH" == "1.14" ]; then
echo "NODE_VERSION=20.x" >> $GITHUB_ENV
else
echo "NODE_VERSION=24.x" >> $GITHUB_ENV
fi
- name: "Checkout (With Branch)"
if: "${{ inputs.branch != '' }}"
uses: actions/checkout@v4
@ -93,7 +82,6 @@ jobs:
run: composer require --no-update --no-scripts --no-interaction "doctrine/dbal:^3.9"
- name: Prepare manifest.json files
if: "${{ inputs.branch != '1.14' }}"
run: |
mkdir -p public/build/admin
mkdir -p public/build/shop
@ -133,7 +121,7 @@ jobs:
database: "mariadb:${{ matrix.mariadb }}"
php_version: ${{ matrix.php }}
symfony_version: ${{ matrix.symfony }}
node_version: ${{ env.NODE_VERSION }}
node_version: "24.x"
chrome_version: stable
- name: Run PHPUnit
@ -178,17 +166,6 @@ jobs:
BEHAT_RERUN_CMD: "vendor/bin/behat --colors --strict --no-interaction -vvv -f pretty --rerun"
steps:
- name: Set variables
shell: bash
env:
BRANCH: ${{ inputs.branch }}
run: |
if [ "$BRANCH" == "1.14" ]; then
echo "NODE_VERSION=20.x" >> $GITHUB_ENV
else
echo "NODE_VERSION=24.x" >> $GITHUB_ENV
fi
- name: "Checkout (With Branch)"
if: "${{ inputs.branch != '' }}"
uses: actions/checkout@v4
@ -214,7 +191,6 @@ jobs:
run: composer require --no-update --no-scripts --no-interaction "doctrine/dbal:^3.9"
- name: Prepare manifest.json files
if: "${{ inputs.branch != '1.14' }}"
run: |
mkdir -p public/build/admin
mkdir -p public/build/shop
@ -254,7 +230,7 @@ jobs:
database: "mariadb:${{ matrix.mariadb }}"
php_version: ${{ matrix.php }}
symfony_version: ${{ matrix.symfony }}
node_version: ${{ env.NODE_VERSION }}
node_version: "24.x"
chrome_version: stable
- name: Run UI Behat

View file

@ -56,17 +56,6 @@ jobs:
BEHAT_RERUN_CMD: "vendor/bin/behat --colors --strict --no-interaction -vvv -f pretty --rerun"
steps:
- name: Set variables
shell: bash
env:
BRANCH: ${{ inputs.branch }}
run: |
if [ "$BRANCH" == "1.14" ]; then
echo "NODE_VERSION=20.x" >> $GITHUB_ENV
else
echo "NODE_VERSION=24.x" >> $GITHUB_ENV
fi
- name: "Checkout (With Branch)"
if: "${{ inputs.branch != '' }}"
uses: actions/checkout@v4
@ -90,7 +79,6 @@ jobs:
run: composer require --no-update --no-scripts --no-interaction "doctrine/dbal:^3.9"
- name: Prepare manifest.json files
if: "${{ inputs.branch != '1.14' }}"
run: |
mkdir -p public/build/admin
mkdir -p public/build/shop
@ -111,7 +99,7 @@ jobs:
database: "mysql:${{ matrix.mysql }}"
php_version: ${{ matrix.php }}
symfony_version: ${{ matrix.symfony }}
node_version: ${{ env.NODE_VERSION }}
node_version: "24.x"
- name: Fix permissions for Symfony logs directory
run: |
@ -163,17 +151,6 @@ jobs:
BEHAT_RERUN_CMD: "vendor/bin/behat --colors --strict --no-interaction -vvv -f pretty --rerun"
steps:
- name: Set variables
shell: bash
env:
BRANCH: ${{ inputs.branch }}
run: |
if [ "$BRANCH" == "1.14" ]; then
echo "NODE_VERSION=20.x" >> $GITHUB_ENV
else
echo "NODE_VERSION=24.x" >> $GITHUB_ENV
fi
- name: "Checkout (With Branch)"
if: "${{ inputs.branch != '' }}"
uses: actions/checkout@v4
@ -197,7 +174,6 @@ jobs:
run: composer require --no-update --no-scripts --no-interaction "doctrine/dbal:^3.9"
- name: Prepare manifest.json files
if: "${{ inputs.branch != '1.14' }}"
run: |
mkdir -p public/build/admin
mkdir -p public/build/shop
@ -218,7 +194,7 @@ jobs:
database: "mysql:${{ matrix.mysql }}"
php_version: ${{ matrix.php }}
symfony_version: ${{ matrix.symfony }}
node_version: ${{ env.NODE_VERSION }}
node_version: "24.x"
- name: Run UI Behat
run: |

View file

@ -56,17 +56,6 @@ jobs:
BEHAT_RERUN_CMD: "vendor/bin/behat --colors --strict --no-interaction -vvv -f pretty --rerun"
steps:
- name: Set variables
shell: bash
env:
BRANCH: ${{ inputs.branch }}
run: |
if [ "$BRANCH" == "1.14" ]; then
echo "NODE_VERSION=20.x" >> $GITHUB_ENV
else
echo "NODE_VERSION=24.x" >> $GITHUB_ENV
fi
- name: "Checkout (With Branch)"
if: "${{ inputs.branch != '' }}"
uses: actions/checkout@v4
@ -86,7 +75,6 @@ jobs:
run: composer require --no-update --no-scripts --no-interaction "doctrine/dbal:^3.9"
- name: Prepare manifest.json files
if: "${{ inputs.branch != '1.14' }}"
run: |
mkdir -p public/build/admin
mkdir -p public/build/shop
@ -107,7 +95,7 @@ jobs:
database: "postgres:${{ matrix.postgres }}"
php_version: ${{ matrix.php }}
symfony_version: ${{ matrix.symfony }}
node_version: ${{ env.NODE_VERSION }}
node_version: "24.x"
chrome_version: stable
- name: Run PHPUnit
@ -151,17 +139,6 @@ jobs:
BEHAT_RERUN_CMD: "vendor/bin/behat --colors --strict --no-interaction -vvv -f pretty --rerun"
steps:
- name: Set variables
shell: bash
env:
BRANCH: ${{ inputs.branch }}
run: |
if [ "$BRANCH" == "1.14" ]; then
echo "NODE_VERSION=20.x" >> $GITHUB_ENV
else
echo "NODE_VERSION=24.x" >> $GITHUB_ENV
fi
- name: "Checkout (With Branch)"
if: "${{ inputs.branch != '' }}"
uses: actions/checkout@v4
@ -181,7 +158,6 @@ jobs:
run: composer require --no-update --no-scripts --no-interaction "doctrine/dbal:^3.9"
- name: Prepare manifest.json files
if: "${{ inputs.branch != '1.14' }}"
run: |
mkdir -p public/build/admin
mkdir -p public/build/shop
@ -202,7 +178,7 @@ jobs:
database: "postgres:${{ matrix.postgres }}"
php_version: ${{ matrix.php }}
symfony_version: ${{ matrix.symfony }}
node_version: ${{ env.NODE_VERSION }}
node_version: "24.x"
chrome_version: stable
- name: Run UI Behat

View file

@ -50,17 +50,6 @@ jobs:
APP_ENV: test_cached
steps:
- name: Set variables
shell: bash
env:
BRANCH: ${{ inputs.branch }}
run: |
if [ "$BRANCH" == "1.12" ]; then
echo "USE_LEGACY_POSTGRES_SETUP=yes" >> $GITHUB_ENV
else
echo "USE_LEGACY_POSTGRES_SETUP=no" >> $GITHUB_ENV
fi
- name: "Checkout (With Branch)"
if: "${{ inputs.branch != '' }}"
uses: actions/checkout@v4

View file

@ -64,17 +64,6 @@ jobs:
BEHAT_RERUN_CMD: "vendor/bin/behat --colors --strict --no-interaction -vvv -f pretty --rerun"
steps:
- name: Set variables
shell: bash
env:
BRANCH: ${{ inputs.branch }}
run: |
if [ "$BRANCH" == "1.14" ]; then
echo "NODE_VERSION=20.x" >> $GITHUB_ENV
else
echo "NODE_VERSION=24.x" >> $GITHUB_ENV
fi
- name: "Checkout (With Branch)"
if: "${{ inputs.branch != '' }}"
uses: actions/checkout@v4
@ -111,7 +100,7 @@ jobs:
database: "mysql:${{ matrix.mysql }}"
php_version: ${{ matrix.php }}
symfony_version: ${{ matrix.symfony }}
node_version: ${{ env.NODE_VERSION }}
node_version: "24.x"
- name: Run Behat (${{ matrix.group }})
run: |
@ -145,17 +134,6 @@ jobs:
BEHAT_RERUN_CMD: "vendor/bin/behat --colors --strict --no-interaction -vvv -f pretty --rerun"
steps:
- name: Set variables
shell: bash
env:
BRANCH: ${{ inputs.branch }}
run: |
if [ "$BRANCH" == "1.14" ]; then
echo "NODE_VERSION=20.x" >> $GITHUB_ENV
else
echo "NODE_VERSION=24.x" >> $GITHUB_ENV
fi
- name: "Checkout (With Branch)"
if: "${{ inputs.branch != '' }}"
uses: actions/checkout@v4
@ -192,7 +170,7 @@ jobs:
database: "mysql:${{ matrix.mysql }}"
php_version: ${{ matrix.php }}
symfony_version: ${{ matrix.symfony }}
node_version: ${{ env.NODE_VERSION }}
node_version: "24.x"
chrome_version: stable
- name: Run Behat (Panther)

View file

@ -122,10 +122,6 @@ jobs:
- name: Run PHPStan
run: vendor/bin/phpstan analyse
- name: Run PHPSpec
if: ${{ inputs.branch == '1.14' }}
run: vendor/bin/phpspec run --ansi --no-interaction -f dot
- name: Run ComposerRequireChecker
run: |
(cat composer.json | jq '.["autoload-dev"]["psr-4"] |= . + {"Sylius\\Behat\\": "src/Sylius/Behat/"}' | jq 'del(.autoload["psr-4"]["Sylius\\Behat\\"])') > _composer.json

View file

@ -1,5 +1,42 @@
# CHANGELOG FOR `2.1.X`
## v2.1.15 (2026-06-02)
#### Details
- [#19038](https://github.com/Sylius/Sylius/pull/19038) [2.1] Prevent stale cart LiveComponents from mutating completed orders ([@TheMilek](https://github.com/TheMilek))
- [#19039](https://github.com/Sylius/Sylius/pull/19039) [2.1][API] Enforce channel eligibility check when changing payment method via account endpoint ([@TheMilek](https://github.com/TheMilek))
- [#19040](https://github.com/Sylius/Sylius/pull/19040) [2.1] Check payment request ownership ([@TheMilek](https://github.com/TheMilek))
## v2.1.14 (2026-04-10)
#### Details
- [#18579](https://github.com/Sylius/Sylius/pull/18579) Fix problem with empty taxon product index ([@tomkalon](https://github.com/tomkalon))
- [#18933](https://github.com/Sylius/Sylius/pull/18933) fix: add default filter to breadcrumbs configuration title to prevent ScalarDataBag exception ([@camilleislasse](https://github.com/camilleislasse))
- [#18943](https://github.com/Sylius/Sylius/pull/18943) Fix build after APIPlatform 4.3.2 release ([@TheMilek](https://github.com/TheMilek))
- [#18941](https://github.com/Sylius/Sylius/pull/18941) Add payment enabled in channel validation ([@marekrzytki](https://github.com/marekrzytki))
- [#18926](https://github.com/Sylius/Sylius/pull/18926) [BUGFIX] Allow updating provinceName when provinceCode is null in API ([@rust-le](https://github.com/rust-le))
- [#18953](https://github.com/Sylius/Sylius/pull/18953) [BUGFIX] Make mailer services public to allow usage in state machine callbacks ([@rust-le](https://github.com/rust-le))
- [#18961](https://github.com/Sylius/Sylius/pull/18961) Resolve flash alert correctly without breaking translation ([@TheMilek](https://github.com/TheMilek))
- [#18940](https://github.com/Sylius/Sylius/pull/18940) Restore missing page titles for admin resource show pages ([@marekrzytki](https://github.com/marekrzytki))
- [#18922](https://github.com/Sylius/Sylius/pull/18922) Unified name translations handling in admin grid index ([@pbalcerzak](https://github.com/pbalcerzak))
- [#18965](https://github.com/Sylius/Sylius/pull/18965) Allow choosing different payment method with skip payment step when it gets disabled ([@TheMilek](https://github.com/TheMilek))
- [#18969](https://github.com/Sylius/Sylius/pull/18969) Add missing status code mapping for OrderItemNotFoundException ([@marekrzytki](https://github.com/marekrzytki))
- [#18970](https://github.com/Sylius/Sylius/pull/18970) Add email validation constraints to cart update ([@marekrzytki](https://github.com/marekrzytki))
- [#18972](https://github.com/Sylius/Sylius/pull/18972) Fix admin templates ([@loic425](https://github.com/loic425))
- [#18974](https://github.com/Sylius/Sylius/pull/18974) Unify Tests directory with tests ([@TheMilek](https://github.com/TheMilek))
## v2.1.13 (2026-03-18)
#### Details
- [#18904](https://github.com/Sylius/Sylius/pull/18904) [BUGFIX] remove redundant `object` from PHPDoc union types ([@rust-le](https://github.com/rust-le))
- [#18899](https://github.com/Sylius/Sylius/pull/18899) [CS][DX] Refactor
- [#18895](https://github.com/Sylius/Sylius/pull/18895) [Admin] Fix product taxon grid `enabled` field always showing `true` ([@serhiilabs](https://github.com/serhiilabs))
- [#18911](https://github.com/Sylius/Sylius/pull/18911) [BUGFIX] fix build errors ([@rust-le](https://github.com/rust-le))
- [#18920](https://github.com/Sylius/Sylius/pull/18920) Telemetry improvements 2.1 ([@TheMilek](https://github.com/TheMilek))
## v2.1.12 (2026-03-09)
#### Details

View file

@ -1,5 +1,45 @@
# CHANGELOG FOR `2.2.X`
## v2.2.6 (2026-06-02)
#### Details
- [#18989](https://github.com/Sylius/Sylius/pull/18989) Fix modals appearing behind backdrop on sticky page-header ([@bartek-sek](https://github.com/bartek-sek))
- [#18990](https://github.com/Sylius/Sylius/pull/18990) Fix attribute card style for product show ([@shochdoerfer](https://github.com/shochdoerfer))
- [#18988](https://github.com/Sylius/Sylius/pull/18988) BUGFIX: Expose ShippingMethod *DeliveryTimeDays in admin API ([@daniellienert](https://github.com/daniellienert))
- [#19009](https://github.com/Sylius/Sylius/pull/19009) [ApiBundle][Tests] Add regression test for anonymous cart pickup wit… ([@Wojdylak](https://github.com/Wojdylak))
- [#19012](https://github.com/Sylius/Sylius/pull/19012) [ApiBundle] Fix "Undefined array key 0" in PathPrefixProvider when path equals API route ([@michalkaczmarek-bitbag](https://github.com/michalkaczmarek-bitbag))
- [#19001](https://github.com/Sylius/Sylius/pull/19001) Bugfix/csrf token ([@michalkaczmarek-bitbag](https://github.com/michalkaczmarek-bitbag))
- [#19017](https://github.com/Sylius/Sylius/pull/19017) Add appendError method to ResponseCheckerInterface ([@Prometee](https://github.com/Prometee))
- [#19018](https://github.com/Sylius/Sylius/pull/19018) [ApiBundle] Fix 404 on GET /shop/products/{code} when all associated products are disabled ([@michalkaczmarek-bitbag](https://github.com/michalkaczmarek-bitbag))
- [#19024](https://github.com/Sylius/Sylius/pull/19024) [2.2] [AttributeBundle] make Add and Delete button translatable in product attribute select type ([@crydotsnake](https://github.com/crydotsnake))
- [#19025](https://github.com/Sylius/Sylius/pull/19025) [API] Add regression tests for cross-customer cart item access ([@GSadee](https://github.com/GSadee))
- [#19026](https://github.com/Sylius/Sylius/pull/19026) [API] Slim down Swagger UI override and drop broken auto-auth JS ([@GSadee](https://github.com/GSadee))
- [#19038](https://github.com/Sylius/Sylius/pull/19038) [2.1] Prevent stale cart LiveComponents from mutating completed orders ([@TheMilek](https://github.com/TheMilek))
- [#19039](https://github.com/Sylius/Sylius/pull/19039) [2.1][API] Enforce channel eligibility check when changing payment method via account endpoint ([@TheMilek](https://github.com/TheMilek))
- [#19040](https://github.com/Sylius/Sylius/pull/19040) [2.1] Check payment request ownership ([@TheMilek](https://github.com/TheMilek))
## v2.2.5 (2026-04-10)
#### Details
- [#18579](https://github.com/Sylius/Sylius/pull/18579) Fix problem with empty taxon product index ([@tomkalon](https://github.com/tomkalon))
- [#18932](https://github.com/Sylius/Sylius/pull/18932) TASK: improve german translations for CH, DE, and AT ([@crydotsnake](https://github.com/crydotsnake))
- [#18933](https://github.com/Sylius/Sylius/pull/18933) fix: add default filter to breadcrumbs configuration title to prevent ScalarDataBag exception ([@camilleislasse](https://github.com/camilleislasse))
- [#18943](https://github.com/Sylius/Sylius/pull/18943) Fix build after APIPlatform 4.3.2 release ([@TheMilek](https://github.com/TheMilek))
- [#18941](https://github.com/Sylius/Sylius/pull/18941) Add payment enabled in channel validation ([@marekrzytki](https://github.com/marekrzytki))
- [#18926](https://github.com/Sylius/Sylius/pull/18926) [BUGFIX] Allow updating provinceName when provinceCode is null in API ([@rust-le](https://github.com/rust-le))
- [#18953](https://github.com/Sylius/Sylius/pull/18953) [BUGFIX] Make mailer services public to allow usage in state machine callbacks ([@rust-le](https://github.com/rust-le))
- [#18961](https://github.com/Sylius/Sylius/pull/18961) Resolve flash alert correctly without breaking translation ([@TheMilek](https://github.com/TheMilek))
- [#18940](https://github.com/Sylius/Sylius/pull/18940) Restore missing page titles for admin resource show pages ([@marekrzytki](https://github.com/marekrzytki))
- [#18922](https://github.com/Sylius/Sylius/pull/18922) Unified name translations handling in admin grid index ([@pbalcerzak](https://github.com/pbalcerzak))
- [#18965](https://github.com/Sylius/Sylius/pull/18965) Allow choosing different payment method with skip payment step when it gets disabled ([@TheMilek](https://github.com/TheMilek))
- [#18969](https://github.com/Sylius/Sylius/pull/18969) Add missing status code mapping for OrderItemNotFoundException ([@marekrzytki](https://github.com/marekrzytki))
- [#18970](https://github.com/Sylius/Sylius/pull/18970) Add email validation constraints to cart update ([@marekrzytki](https://github.com/marekrzytki))
- [#18972](https://github.com/Sylius/Sylius/pull/18972) Fix admin templates ([@loic425](https://github.com/loic425))
- [#18958](https://github.com/Sylius/Sylius/pull/18958) [API] Make API Platform resource command classes overridable via container parameters ([@Prometee](https://github.com/Prometee))
- [#18974](https://github.com/Sylius/Sylius/pull/18974) Unify Tests directory with tests ([@TheMilek](https://github.com/TheMilek))
## v2.2.4 (2026-03-18)
#### Details

View file

@ -1,3 +1,53 @@
# UPGRADE FROM `2.1.13` TO `2.1.14`
### Admin resource translations
Translations for admin-managed resources (such as product options, attributes, associations) are now resolved using the current admin locale instead of the default `%locale%` parameter.
Previously, translation-aware query builders relied on a static `%locale%` parameter, which could lead to inconsistencies when the admin user was working in a different language than the application default.
This has been updated to dynamically resolve the locale from the admin context.
### Before
```yaml
sylius_grid:
grids:
sylius_admin_product_association_type:
driver:
name: doctrine/orm
options:
class: "%sylius.model.product_association_type.class%"
repository:
method: createListQueryBuilder
arguments: ["%locale%"]
```
### After
```yaml
sylius_grid:
grids:
sylius_admin_product_association_type:
driver:
name: doctrine/orm
options:
class: "%sylius.model.product_association_type.class%"
repository:
method: createListQueryBuilder
arguments: ["expr:service('sylius.context.locale').getLocaleCode()"]
```
### Restore missing admin resource show title
A missing page title has been restored to the admin resource show pages (e.g. product, order, customer, shipment, catalog promotion).
Added separated show routes for each resource with dedicated show page templates.
### Order payment method eligibility check
The `Sylius\Bundle\CoreBundle\Validator\Constraints\OrderPaymentMethodEligibilityValidator` and
`Sylius\Bundle\ApiBundle\Validator\Constraints\OrderPaymentMethodEligibilityValidator` now checks also if
payment method is assigned to the channel of the order.
# UPGRADE FROM `2.1.12` TO `2.1.13`
### Telemetry improvements

View file

@ -53,6 +53,12 @@ SYLIUS_TELEMETRY_SALT=your-custom-salt
1. The `Sylius\Bundle\ReviewBundle\Updater\ReviewableRatingUpdaterInterface::updateFromReview()` method has been deprecated and will be removed in Sylius 3.0. Use state machine mechanism implemented by Symfony Workflow instead.
## Admin UI
1. A new `modal-portal.js` script has been added to `AdminBundle`.
It moves Bootstrap modal elements to `<body>` before they are displayed,
preventing them from being rendered behind the Bootstrap backdrop when nested inside a CSS stacking context (e.g. the sticky `.page-header`).
## Translations
1. The `TranslationLocaleProvider` now ensures that the default locale (configured as `locale` in `config/parameters.yaml`)

View file

@ -1,10 +1,170 @@
# UPGRADE FROM `2.2` TO `2.3`
## Configuration
1. The default value of `sylius_core.order_by_identifier` has been changed from `true` to `false`. ([#18956](https://github.com/Sylius/Sylius/pull/18956))
The `OrderByIdentifierSqlWalker` is no longer enabled by default.
If your application relies on ordering by identifier, enable it explicitly in your configuration:
```yaml
sylius_core:
order_by_identifier: true
```
2. Configuration changes related to the broadened Doctrine support (see the *Dependencies* section).
These only matter once you opt into **DoctrineBundle 3** / **DBAL 4**:
- The `auto_generate_proxy_classes: "%kernel.debug%"` option was removed from Sylius' Doctrine configuration
(it no longer exists in DoctrineBundle 3, and since PHP 8.4 Doctrine uses native lazy objects). If you are still
on DoctrineBundle 2 and rely on this behavior, set it explicitly in your own application configuration.
- The ORM metadata/query/result cache configuration was switched from wrapped `Doctrine\Common\Cache` services
to **PSR-6 cache pools** (`type: pool`). This change lives in the application configuration (`config/packages/{prod,test}/doctrine.yaml`),
which is **not** updated automatically on existing installations, update those files in your project accordingly:
```diff
doctrine:
orm:
entity_managers:
default:
metadata_cache_driver:
- type: service
- id: doctrine.system_cache_provider
+ type: pool
+ pool: doctrine.system_cache_pool
```
As part of this switch, the `doctrine.result_cache_provider` and `doctrine.system_cache_provider` services
(defined in Sylius' application configuration, wrapping the PSR-6 pools via `Doctrine\Common\Cache\Psr6\DoctrineProvider`)
were **removed**. If you referenced them by id, use the cache pools directly (`doctrine.system_cache_pool`,
`doctrine.result_cache_pool`) with `type: pool` as shown above.
- On **PostgreSQL**, Sylius now forces the `SEQUENCE` identity generation strategy
(`identity_generation_preferences` for `PostgreSQLPlatform`) to keep the database schema backward compatible
with existing installations.
## Dependencies
1. The `knplabs/gaufrette` and `knplabs/knp-gaufrette-bundle` packages have been removed.
1. The `behat/transliterator` package has been **deprecated** and will be removed in Sylius 3.0.
Slug generation now **primarily** uses `symfony/string` (`Symfony\Component\String\Slugger\SluggerInterface`).
When no `$slugger` is injected, the system falls back to `Behat\Transliterator\Transliterator`, but this fallback behavior is deprecated and will be removed in Sylius 3.0.
The following classes have been updated — if you have extended or decorated them, update your constructor accordingly:
- `Sylius\Component\Product\Generator\SlugGenerator`:
```diff
-public function __construct()
+public function __construct(private ?SluggerInterface $slugger)
```
> **Deprecated:** Passing `null` as `$slugger` (or omitting it) is deprecated since Sylius 2.3.
> When `null` is passed, the generator falls back to `Behat\Transliterator\Transliterator`.
> Both the nullable argument and the `behat/transliterator` fallback will be removed in Sylius 3.0.
- `Sylius\Component\Taxonomy\Generator\TaxonSlugGenerator`:
```diff
-public function __construct()
+public function __construct(private ?SluggerInterface $slugger)
```
> **Deprecated:** Same as above.
- `Sylius\Bundle\AdminBundle\Generator\TaxonSlugGenerator`:
```diff
public function __construct(
private BaseTaxonSlugGeneratorInterface $slugGenerator,
+ private ?SluggerInterface $slugger,
)
```
> **Deprecated:** Same as above.
The `StringInflector::nameToSlug()` method has been **deprecated** and will be removed in Sylius 3.0.
2. The `knplabs/gaufrette` and `knplabs/knp-gaufrette-bundle` packages have been removed.
The Gaufrette integration has been unusable as a filesystem adapter.
Since Sylius 2.0 the default filesystem adapter uses Flysystem instead.
If your application depends on the Gaufrette packages directly, require them explicitly in your `composer.json`.
3. The `symfony/proxy-manager-bridge` and `friendsofphp/proxy-manager-lts` packages have been removed.
They are no longer needed, lazy services now rely on PHP's native lazy proxies provided by
`symfony/var-exporter` (the default since Symfony 6.4). No change is required in your application.
If your application depends on these packages directly, require them explicitly in your `composer.json`.
4. The supported Doctrine version ranges have been **broadened** to allow the newer stack
(`doctrine/doctrine-bundle` `^2.13 || ^3.0`, `doctrine/dbal` `^3.9 || ^4.0`,
`doctrine/persistence` `^3.3 || ^4.0`, `doctrine/data-fixtures` `^1.7 || ^2.2`).
DBAL 4 removes the built-in `object` and `array` column types. Since Sylius maps two fields
as `type="object"` (`PaymentSecurityToken.details` and `PaymentRequest.payload`), it registers
a custom `Sylius\Bundle\PaymentBundle\Doctrine\DBAL\Type\ObjectType` to keep them working.
## Validation
1. Passing an array of options to configure a Sylius validation constraint is **deprecated** since Sylius 2.3
and will be removed in Sylius 3.0. Use named arguments instead.
All Sylius validation constraints now declare explicit constructors with named arguments
(marked with `#[HasNamedArguments]`). The legacy array syntax keeps working, it only triggers deprecation.
Configuring constraints via **XML / YAML / PHP attributes is not affected** and requires no changes; the validator
loaders pass the options as named arguments automatically. Only **direct instantiation in PHP** should be migrated:
```diff
-new ProvinceAddressConstraint(['message' => 'My custom message'])
+new ProvinceAddressConstraint(message: 'My custom message')
```
2. Several constraint message options have been renamed to follow the consistent `*Message` convention. The old option
names and public properties are **deprecated** since Sylius 2.3 and will be removed in Sylius 3.0. Both keep working
and stay in sync in the meantime; switch to the new `*Message` name:
| Constraint | Old | New |
|------------|-----|-----|
| `ApiBundle\...\ChosenPaymentMethodEligibility` | `notAvailable`, `notExist`, `paymentNotFound` | `notAvailableMessage`, `notExistMessage`, `paymentNotFoundMessage` |
| `ApiBundle\...\ChosenPaymentRequestActionEligibility` | `notAvailable`, `notExist` | `notAvailableMessage`, `notExistMessage` |
| `ApiBundle\...\AddingEligibleProductVariantToCart` | `productVariantNotSufficient` | `productVariantNotSufficientMessage` |
| `ApiBundle\...\ChangedItemQuantityInCart` | `productVariantNotLongerAvailable`, `productVariantNotSufficient` | `productVariantNotLongerAvailableMessage`, `productVariantNotSufficientMessage` |
| `PromotionBundle\...\PromotionRuleType`, `PromotionActionType`, `CatalogPromotionActionType`, `CatalogPromotionScopeType` | `invalidType` | `invalidTypeMessage` |
| `PaymentBundle\...\GatewayFactoryExists` | `invalidGatewayFactory` | `invalidGatewayFactoryMessage` |
| `ShippingBundle\...\ShippingMethodCalculatorExists` | `invalidShippingCalculator` | `invalidShippingCalculatorMessage` |
| `ShippingBundle\...\ShippingMethodRule` | `invalidType` | `invalidTypeMessage` |
## Deprecations
1. Passing a `Sylius\Component\Core\Calculator\ProductVariantPricesCalculatorInterface` directly to the following catalog-facing classes is deprecated since Sylius 2.3.
Implement `Sylius\Component\Core\Calculator\CatalogPricesCalculatorInterface` instead, which extends `ProductVariantPricesCalculatorInterface` with no additional methods.
It will be required in Sylius 3.0.
Affected classes:
- `Sylius\Bundle\CoreBundle\Twig\PriceExtension`
- `Sylius\Bundle\ApiBundle\Serializer\Normalizer\ProductVariantNormalizer`
- `Sylius\Bundle\ShopBundle\Twig\Component\Product\PriceComponent`
- `Sylius\Bundle\ShopBundle\Twig\Component\Product\CardComponent`
- `Sylius\Component\Core\Provider\ProductVariantMap\ProductVariantPriceMapProvider`
- `Sylius\Component\Core\Provider\ProductVariantMap\ProductVariantOriginalPriceMapProvider`
- `Sylius\Component\Core\Provider\ProductVariantMap\ProductVariantLowestPriceMapProvider`
If you have a custom calculator used for catalog display, make it implement `CatalogPricesCalculatorInterface`:
```php
use Sylius\Component\Core\Calculator\CatalogPricesCalculatorInterface;
final class MyCustomCatalogPriceCalculator implements CatalogPricesCalculatorInterface
{
// ...
}
```
This allows you to decorate catalog display pricing independently from cart/order pricing
(`sylius.order_processing.order_prices_recalculator`, `sylius.filter.promotion.price_range`),
which remain on `ProductVariantPricesCalculatorInterface`.

View file

@ -1,3 +1,26 @@
# UPGRADE FROM `2.1.14` TO `2.1.15`
## Security
### Payment request ownership enforcement
`GET /api/v2/shop/payment-requests/{hash}`, `PUT /api/v2/shop/payment-requests/{hash}` and `POST /api/v2/shop/orders/{tokenValue}/payment-requests` now enforce ownership:
- An unauthenticated request receives `404 Not Found`, unless the underlying order is a guest order. An order qualifies as a guest order when it has no customer, when its customer has no associated user account, or when it was placed through the guest checkout flow (`Order::isCreatedByGuest()` returns `true`).
- An authenticated shop user can only access payment requests belonging to their own orders; requests for another customer's payment request also receive `404 Not Found`.
Previously these operations could be performed by any authenticated user or even an anonymous user who knew the payment request hash (or, for the creation endpoint, the order token value), which constituted a broken object-level authorization (IDOR) vulnerability.
**No action is required** unless your integration assumed that these endpoints were publicly accessible or shared across customers.
### `Sylius\Bundle\ApiBundle\StateProvider\Shop\Payment\PaymentRequest\ItemProvider` constructor
A new `UserContextInterface` argument is appended to the constructor. Omitting it is deprecated and will be required in Sylius 3.0; without it the ownership check is skipped and the provider falls back to its previous behavior.
### `Sylius\Bundle\ApiBundle\CommandHandler\Payment\AddPaymentRequestHandler` constructor
A new, nullable `UserContextInterface` argument is appended to the constructor. When it is not provided, the ownership check is skipped and the handler falls back to its previous behavior.
# UPGRADE FROM `2.1.10` TO `2.1.11`
### Constructor signature changes

View file

@ -49,3 +49,22 @@ Additionally, the redundant `code` field has been removed from the error respons
- If your API client reads `response.data.code`, use `response.status` (HTTP header) instead
**References:** RFC 9110 (400 = syntactic errors, 422 = semantic/validation errors)
## API Platform resource classes as container parameters
The following API Platform resource classes are now defined as container parameters, allowing you to override them:
| Parameter | Default class |
|---|---|
| `sylius_api.command.account.reset_password.class` | `Sylius\Bundle\ApiBundle\Command\Account\ResetPassword` |
| `sylius_api.command.account.verify_shop_user.class` | `Sylius\Bundle\ApiBundle\Command\Account\VerifyShopUser` |
| `sylius_api.command.admin.account.reset_password.class` | `Sylius\Bundle\ApiBundle\Command\Admin\Account\ResetPassword` |
| `sylius_api.command.send_contact_request.class` | `Sylius\Bundle\ApiBundle\Command\SendContactRequest` |
To override a class, define the parameter in your configuration:
```yaml
parameters:
sylius_api.command.account.reset_password.class: App\Api\Command\CustomResetPassword
```

View file

@ -1,7 +1,7 @@
{
"name": "sylius/sylius",
"type": "library",
"version": "v2.2.5-dev",
"version": "v2.2.7-dev",
"description": "E-Commerce platform for PHP, based on Symfony framework.",
"homepage": "https://sylius.com",
"license": "MIT",
@ -48,7 +48,6 @@
"doctrine/persistence": "^3.3 || ^4.0",
"egulias/email-validator": "^4.0",
"fakerphp/faker": "^1.23",
"friendsofphp/proxy-manager-lts": "^1.0",
"gedmo/doctrine-extensions": "^3.20",
"guzzlehttp/guzzle": "^7.9",
"guzzlehttp/psr7": "^2.5",
@ -73,7 +72,7 @@
"ramsey/uuid": "^4.7",
"stof/doctrine-extensions-bundle": "^1.12",
"sylius-labs/association-hydrator": "^1.2",
"sylius-labs/doctrine-migrations-extra-bundle": "^0.3",
"sylius-labs/doctrine-migrations-extra-bundle": "^0.2 || ^0.3",
"sylius/fixtures-bundle": "^1.9",
"sylius/grid": "^1.13",
"sylius/grid-bundle": "^1.13",
@ -115,7 +114,6 @@
"symfony/process": "^6.4 || ^7.4",
"symfony/property-access": "^6.4 || ^7.4",
"symfony/property-info": "^6.4 || ^7.4",
"symfony/proxy-manager-bridge": "^6.4 || ^7.4",
"symfony/routing": "^6.4.1 || ^7.4",
"symfony/security-bundle": "^6.4 || ^7.4",
"symfony/security-core": "^6.4 || ^7.4",

View file

@ -25,3 +25,6 @@ sylius_payment:
encryption:
disabled_for_factories:
- online-disabled
sylius_core:
order_by_identifier: true

View file

@ -0,0 +1,23 @@
admin_basic_create:
path: /admin/basic/create
controller: Symfony\Bundle\FrameworkBundle\Controller\TemplateController
defaults:
template: admin/basic/create.html.twig
admin_basic_update:
path: /admin/basic/update
controller: Symfony\Bundle\FrameworkBundle\Controller\TemplateController
defaults:
template: admin/basic/update.html.twig
admin_basic_index:
path: /admin/basic/index
controller: Symfony\Bundle\FrameworkBundle\Controller\TemplateController
defaults:
template: admin/basic/index.html.twig
admin_basic_show:
path: /admin/basic/show
controller: Symfony\Bundle\FrameworkBundle\Controller\TemplateController
defaults:
template: admin/basic/show.html.twig

View file

@ -0,0 +1,39 @@
@stale_live_component
Feature: Stale cart LiveComponent cannot mutate a completed order
In order to protect completed orders from data corruption
As a Developer
I want the cart LiveComponent to be safe against stale browser state
Background:
Given the store operates on a single channel in "United States"
And the store has a product "Sylius T-Shirt" priced at "$19.99"
@ui @javascript
Scenario: Clearing cart from a stale page does not delete a completed order
Given I added product "Sylius T-Shirt" to the cart
And I check the details of my cart
And I note the current order id for later assertions
When the order is completed in the background
And I clear my cart from the stale page without reloading
Then the completed order should still exist in the database
And the order checkout state should be "completed"
@ui @javascript
Scenario: Removing an item from a stale page does not mutate a completed order
Given I added product "Sylius T-Shirt" to the cart
And I check the details of my cart
And I note the current order id for later assertions
When the order is completed in the background
And I remove first item from cart from the stale page without reloading
Then the completed order should still exist in the database
And the order should still have 1 item
@ui @javascript
Scenario: Increasing item quantity on a stale page does not mutate a completed order
Given I added product "Sylius T-Shirt" to the cart
And I check the details of my cart
And I note the current order id for later assertions
When the order is completed in the background
And I increase the quantity of the first cart item to 2 on the stale page without reloading
Then the completed order should still exist in the database
And the order item quantity should still be 1

View file

@ -0,0 +1,47 @@
@paying_for_order
Feature: Preventing placing an order with a payment method not available in channel
In order to have my order shipped without issues
As a Visitor
I want to be prevented from placing an order with a payment method not available in my channel
Background:
Given the store operates on a single channel in the "United States" named "US Web Store"
And the store has a product "Ubi T-Shirt" priced at "$19.99"
And the store ships everywhere for Free
And the store allows paying "Bank Transfer"
And I am a logged in customer
@api @ui
Scenario: Being prevented from placing an order with a payment method that is not available in my channel
Given I added product "Ubi T-Shirt" to the cart
And I have proceeded selecting "Bank Transfer" payment method
And the payment method "Bank Transfer" has been disabled in "US Web Store" channel
When I try to confirm my order
Then I should be informed that this payment method has been disabled
And I should not see the thank you page
@api @ui
Scenario: Being prevented from placing an order with a payment method that is disabled
Given I added product "Ubi T-Shirt" to the cart
And I have proceeded selecting "Bank Transfer" payment method
But the payment method "Bank Transfer" is disabled
When I try to confirm my order
Then I should be informed that this payment method has been disabled
And I should not see the thank you page
@api @ui
Scenario: Being prevented from placing an order with a payment method that is disabled and not available in my channel
Given I added product "Ubi T-Shirt" to the cart
And I have proceeded selecting "Bank Transfer" payment method
But the payment method "Bank Transfer" is disabled
And the payment method "Bank Transfer" has been disabled in "US Web Store" channel
When I try to confirm my order
Then I should be informed that this payment method has been disabled
And I should not see the thank you page
@api @ui
Scenario: Being able to place an order with enabled payment method in my channel
Given I added product "Ubi T-Shirt" to the cart
And I have proceeded selecting "Bank Transfer" payment method
When I try to confirm my order
Then I should see the thank you page

View file

@ -45,3 +45,35 @@ Feature: Skipping payment step when only one payment method is available
When I complete addressing step with email "guest@example.com" and "United States" based billing address
And I complete the shipping step with the first shipping method
Then I should be on the checkout payment step
@api @ui
Scenario: Being able to recover after the auto-selected payment method gets disabled
Given the payment method "Bank transfer" is disabled
And the store allows paying with "Offline"
And I added product "Guards! Guards!" to the cart
And I complete addressing step with email "guest@example.com" and "United States" based billing address
And I complete the shipping step with the first shipping method
And the payment method "Offline" is disabled
And the payment method "Bank transfer" is enabled
And I have tried to confirm my order
And I have been informed that this payment method has been disabled
When I go back to payment step of the checkout
And I choose "Bank transfer" payment method
And I confirm my order
Then I should see the thank you page
@api @ui
Scenario: Being able to recover after the auto-selected payment method gets removed from channel
Given the payment method "Bank transfer" is disabled
And the store allows paying with "Offline"
And I added product "Guards! Guards!" to the cart
And I complete addressing step with email "guest@example.com" and "United States" based billing address
And I complete the shipping step with the first shipping method
And the payment method "Offline" has been disabled in "United States" channel
And the payment method "Bank transfer" is enabled
And I have tried to confirm my order
And I have been informed that this payment method has been disabled
When I go back to payment step of the checkout
And I choose "Bank transfer" payment method
And I confirm my order
Then I should see the thank you page

View file

@ -0,0 +1,50 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Sylius Sp. z o.o.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Symfony\Component\DependencyInjection\Loader\Configurator;
use Sylius\Abstraction\StateMachine\CompositeStateMachine;
use Sylius\Abstraction\StateMachine\StateMachineInterface;
use Sylius\Abstraction\StateMachine\SymfonyWorkflowAdapter;
use Sylius\Abstraction\StateMachine\Twig\StateMachineExtension;
return static function (ContainerConfigurator $container): void {
$services = $container->services();
$services->defaults()->public();
$services->set('sylius_abstraction.state_machine', CompositeStateMachine::class)
->args([
tagged_iterator('sylius.state_machine', indexAttribute: 'key'),
'%sylius_abstraction.state_machine.default_adapter%',
'%sylius_abstraction.state_machine.graphs_to_adapters_mapping%',
]);
$services->alias(StateMachineInterface::class . ' $compositeStateMachine', 'sylius_abstraction.state_machine.composite');
$services->alias('sylius_abstraction.state_machine.composite', 'sylius_abstraction.state_machine');
$services->alias(StateMachineInterface::class, 'sylius_abstraction.state_machine');
$services->set('sylius_abstraction.state_machine.adapter.symfony_workflow', SymfonyWorkflowAdapter::class)
->args([
service('workflow.registry'),
])
->tag('sylius.state_machine', ['key' => 'symfony_workflow']);
$services->alias(StateMachineInterface::class . ' $symfonyWorkflow', 'sylius_abstraction.state_machine.adapter.symfony_workflow');
$services->set('sylius_abstraction.twig.extension.state_machine', StateMachineExtension::class)
->args([
service('sylius_abstraction.state_machine'),
])
->tag('twig.extension');
};

View file

@ -1,43 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
This file is part of the Sylius package.
(c) Sylius Sp. z o.o.
For the full copyright and license information, please view the LICENSE
file that was distributed with this source code.
-->
<container
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://symfony.com/schema/dic/services"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"
>
<services>
<defaults public="true" />
<service id="sylius_abstraction.state_machine" class="Sylius\Abstraction\StateMachine\CompositeStateMachine">
<argument type="tagged_iterator" tag="sylius.state_machine" index-by="key" />
<argument>%sylius_abstraction.state_machine.default_adapter%</argument>
<argument>%sylius_abstraction.state_machine.graphs_to_adapters_mapping%</argument>
</service>
<service id="Sylius\Abstraction\StateMachine\StateMachineInterface $compositeStateMachine" alias="sylius_abstraction.state_machine.composite" />
<service id="sylius_abstraction.state_machine.composite" alias="sylius_abstraction.state_machine" />
<service id="Sylius\Abstraction\StateMachine\StateMachineInterface" alias="sylius_abstraction.state_machine" />
<service id="sylius_abstraction.state_machine.adapter.symfony_workflow" class="Sylius\Abstraction\StateMachine\SymfonyWorkflowAdapter">
<argument type="service" id="workflow.registry" />
<tag name="sylius.state_machine" key="symfony_workflow" />
</service>
<service id="Sylius\Abstraction\StateMachine\StateMachineInterface $symfonyWorkflow" alias="sylius_abstraction.state_machine.adapter.symfony_workflow" />
<service id="sylius_abstraction.twig.extension.state_machine" class="Sylius\Abstraction\StateMachine\Twig\StateMachineExtension">
<argument type="service" id="sylius_abstraction.state_machine" />
<tag name="twig.extension" />
</service>
</services>
</container>

View file

@ -0,0 +1,30 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Sylius Sp. z o.o.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Symfony\Component\DependencyInjection\Loader\Configurator;
use Sylius\Abstraction\StateMachine\StateMachineInterface;
use Sylius\Abstraction\StateMachine\WinzouStateMachineAdapter;
return static function (ContainerConfigurator $container): void {
$services = $container->services();
$services->defaults()->public();
$services->set('sylius_abstraction.state_machine.adapter.winzou_state_machine', WinzouStateMachineAdapter::class)
->args([
service('sm.factory'),
])
->tag('sylius.state_machine', ['key' => 'winzou_state_machine']);
$services->alias(StateMachineInterface::class . ' $winzouStateMachine', 'sylius_abstraction.state_machine.adapter.winzou_state_machine');
};

View file

@ -1,28 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
This file is part of the Sylius package.
(c) Sylius Sp. z o.o.
For the full copyright and license information, please view the LICENSE
file that was distributed with this source code.
-->
<container
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://symfony.com/schema/dic/services"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"
>
<services>
<defaults public="true" />
<service id="sylius_abstraction.state_machine.adapter.winzou_state_machine" class="Sylius\Abstraction\StateMachine\WinzouStateMachineAdapter">
<argument type="service" id="sm.factory" />
<tag name="sylius.state_machine" key="winzou_state_machine" />
</service>
<service id="Sylius\Abstraction\StateMachine\StateMachineInterface $winzouStateMachine" alias="sylius_abstraction.state_machine.adapter.winzou_state_machine" />
</services>
</container>

View file

@ -16,7 +16,7 @@ namespace Sylius\Abstraction\StateMachine\DependencyInjection;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
final class SyliusStateMachineAbstractionExtension extends Extension
{
@ -24,13 +24,13 @@ final class SyliusStateMachineAbstractionExtension extends Extension
{
$config = $this->processConfiguration($this->getConfiguration([], $container), $configs);
$loader = new XmlFileLoader($container, new FileLocator(dirname(__DIR__, 2) . '/config/'));
$loader->load('services.xml');
$loader = new PhpFileLoader($container, new FileLocator(dirname(__DIR__, 2) . '/config/'));
$loader->load('services.php');
if ($container->hasParameter('kernel.bundles')) {
$bundles = $container->getParameter('kernel.bundles');
if (array_key_exists('winzouStateMachineBundle', $bundles)) {
$loader->load('services/integrations/winzou.xml');
$loader->load('services/integrations/winzou.php');
}
}

View file

@ -93,6 +93,8 @@ interface ResponseCheckerInterface
public function hasViolationWithMessage(Response $response, string $message, ?string $property = null): bool;
public function appendError(Response $response): self;
public function cleanErrors(): void;
/** @return array{

View file

@ -13,11 +13,11 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\Given;
use Behat\Step\When;
use Behat\Step\Then;
use ApiPlatform\Metadata\IriConverterInterface;
use Behat\Behat\Context\Context;
use Behat\Step\Given;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use ApiPlatform\Metadata\IriConverterInterface;
use Behat\Behat\Context\Context;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Context\Api\Resources;
use Sylius\Component\Core\Formatter\StringInflector;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Component\Core\Model\ChannelInterface;

View file

@ -13,8 +13,8 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin\Helper;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Component\Core\Formatter\StringInflector;
use Webmozart\Assert\Assert;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiSecurityClientInterface;
use Sylius\Behat\Service\SharedStorageInterface;
use Symfony\Component\BrowserKit\Exception\BadMethodCallException;

View file

@ -13,10 +13,10 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\Given;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Given;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\RequestBuilder;
use Sylius\Behat\Client\ResponseCheckerInterface;

View file

@ -13,10 +13,10 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\Given;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Given;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Admin\Helper\ValidationTrait;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Service\Converter\IriConverterInterface;

View file

@ -13,8 +13,8 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Admin\Helper\ValidationTrait;

View file

@ -13,10 +13,10 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use ApiPlatform\Metadata\IriConverterInterface;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Admin\Helper\ValidationTrait;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Admin\Helper\ValidationTrait;

View file

@ -13,10 +13,10 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use ApiPlatform\Metadata\IriConverterInterface;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,10 +13,10 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\Given;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Given;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,10 +13,10 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\Given;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Given;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Admin\Helper\ValidationTrait;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\Given;
use ApiPlatform\Metadata\IriConverterInterface;
use Behat\Behat\Context\Context;
use Behat\Step\Given;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;

View file

@ -13,10 +13,10 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Behat\Context\Context;
use Behat\Step\Given;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Admin\Helper\ValidationTrait;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\RequestFactoryInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;

View file

@ -13,10 +13,10 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\Given;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Given;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Ramsey\Uuid\Uuid;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\RequestBuilder;
use Sylius\Behat\Client\ResponseCheckerInterface;

View file

@ -13,11 +13,11 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\Given;
use Behat\Step\When;
use Behat\Step\Then;
use ApiPlatform\Metadata\IriConverterInterface;
use Behat\Behat\Context\Context;
use Behat\Step\Given;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Admin\Helper\ValidationTrait;

View file

@ -13,10 +13,10 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\Given;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Given;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,10 +13,10 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use ApiPlatform\Metadata\IriConverterInterface;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Admin\Helper\ValidationTrait;

View file

@ -13,8 +13,8 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Behat\Context\Context;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Context\Api\Resources;
use Sylius\Component\Core\Model\ChannelInterface;

View file

@ -13,10 +13,10 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\Given;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Given;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\RequestBuilder;
use Sylius\Behat\Client\ResponseCheckerInterface;

View file

@ -13,10 +13,10 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\Given;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Given;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\RequestFactoryInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;

View file

@ -13,10 +13,10 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use ApiPlatform\Metadata\IriConverterInterface;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Admin\Helper\ValidationTrait;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Admin\Helper\ValidationTrait;

View file

@ -13,10 +13,10 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\Given;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Given;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Admin\Helper\ValidationTrait;

View file

@ -13,10 +13,10 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\Given;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Given;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Admin\Helper\ValidationTrait;

View file

@ -13,10 +13,10 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use ApiPlatform\Metadata\IriConverterInterface;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Admin\Helper\ValidationTrait;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\RequestBuilder;
use Sylius\Behat\Client\ResponseCheckerInterface;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Admin\Helper\ValidationTrait;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Admin\Helper\ValidationTrait;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,8 +13,8 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\RequestFactoryInterface;

View file

@ -13,8 +13,8 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Admin;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Webmozart\Assert\Assert;

View file

@ -13,8 +13,8 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Common;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Webmozart\Assert\Assert;

View file

@ -13,11 +13,11 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api;
use Behat\Hook\AfterStep;
use Behat\Hook\AfterScenario;
use Behat\Behat\Context\Context;
use Behat\Behat\Hook\Scope\AfterScenarioScope;
use Behat\Behat\Hook\Scope\AfterStepScope;
use Behat\Hook\AfterScenario;
use Behat\Hook\AfterStep;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Symfony\Component\Console\Formatter\OutputFormatterStyle;
use Symfony\Component\Console\Output\ConsoleOutput;

View file

@ -13,8 +13,8 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Sylius\Behat\Service\Checker\EmailCheckerInterface;
use Sylius\Behat\Service\SharedStorageInterface;
use Sylius\Component\Core\Model\OrderInterface;

View file

@ -13,10 +13,10 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Shop;
use Behat\Step\Given;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Given;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Shop;
use Behat\Step\Given;
use ApiPlatform\Metadata\IriConverterInterface;
use Behat\Behat\Context\Context;
use Behat\Step\Given;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Shop;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Shop\Checkout;
use Behat\Behat\Context\Context;
use Behat\Step\Given;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\RequestFactoryInterface;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Shop\Checkout;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -106,6 +106,7 @@ final class CheckoutContext implements Context
}
#[When('the customer is at the checkout payment step')]
#[When('I go back to payment step of the checkout')]
public function theCustomerIsAtTheCheckoutPaymentStep(): void
{
// Intentionally left blank, as this is a UI-specific action.
@ -387,6 +388,7 @@ final class CheckoutContext implements Context
$this->sharedStorage->set('order', $this->orderRepository->findOneByNumber($this->sharedStorage->get('order_number')));
}
#[Given('I have tried to confirm my order')]
#[When('I try to confirm my order')]
public function iTryToConfirmMyOrder(): void
{
@ -989,6 +991,7 @@ final class CheckoutContext implements Context
$this->hasProvinceNameInAddress($provinceName, $addressType);
}
#[Given('/^I have been informed that (this payment method) has been disabled$/')]
#[Then('/^I should be informed that (this payment method) has been disabled$/')]
public function iShouldBeInformedThatThisPaymentMethodHasBeenDisabled(PaymentMethodInterface $paymentMethod): void
{

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Shop;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\RequestFactoryInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Shop;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Shop;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\RequestFactoryInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Shop;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,10 +13,10 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Shop;
use Behat\Step\When;
use Behat\Step\Then;
use ApiPlatform\Metadata\IriConverterInterface;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Doctrine\Persistence\ObjectManager;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Shop;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,11 +13,11 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Shop;
use Behat\Step\Given;
use Behat\Step\When;
use Behat\Step\Then;
use ApiPlatform\Metadata\IriConverterInterface;
use Behat\Behat\Context\Context;
use Behat\Step\Given;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ApiSecurityClientInterface;
use Sylius\Behat\Client\RequestFactoryInterface;

View file

@ -13,10 +13,10 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Shop;
use Behat\Step\When;
use Behat\Step\Then;
use ApiPlatform\Metadata\IriConverterInterface;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\RequestFactoryInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Shop;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Shop;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Service\SharedStorageInterface;

View file

@ -13,9 +13,9 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Shop;
use Behat\Step\When;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\Request;
use Sylius\Behat\Client\RequestFactoryInterface;

View file

@ -13,8 +13,8 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Shop;
use Behat\Step\Then;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Sylius\Behat\Client\ApiClientInterface;
use Sylius\Behat\Client\ResponseCheckerInterface;
use Sylius\Behat\Context\Api\Resources;

View file

@ -13,10 +13,10 @@ declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Shop;
use Behat\Step\When;
use Behat\Step\Then;
use ApiPlatform\Metadata\IriConverterInterface;
use Behat\Behat\Context\Context;
use Behat\Step\Then;
use Behat\Step\When;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Persistence\ObjectManager;
use Sylius\Behat\Client\ApiClientInterface;

Some files were not shown because too many files have changed in this diff Show more