diff --git a/.github/workflows/application.yml b/.github/workflows/application.yml index 4fe81098fcf..9b78ce6196c 100644 --- a/.github/workflows/application.yml +++ b/.github/workflows/application.yml @@ -20,7 +20,7 @@ on: cron: "0 1 * * 6" # Run at 1am every Saturday workflow_dispatch: ~ -jobs: +jobsg a static-checks: runs-on: ubuntu-latest @@ -32,7 +32,7 @@ jobs: fail-fast: false matrix: php: ["7.4", "8.0"] - symfony: ["^4.4", "5.2.*", "5.3.*"] + symfony: ["^4.4", "5.2.*", "5.3.*", "5.4.*"] steps: - @@ -120,7 +120,7 @@ jobs: fail-fast: false matrix: php: ["7.4", "8.0"] - symfony: ["^4.4", "5.2.*", "5.3.*"] + symfony: ["^4.4", "5.2.*", "5.3.*", "5.4.*"] node: ["14.x"] mysql: ["5.7", "8.0"] @@ -249,7 +249,7 @@ jobs: fail-fast: false matrix: php: ["7.4", "8.0"] - symfony: ["^4.4", "5.2.*", "5.3.*"] + symfony: ["^4.4", "5.2.*", "5.3.*", "5.4.*"] node: ["14.x"] mysql: ["5.7", "8.0"] diff --git a/.github/workflows/packages.yml b/.github/workflows/packages.yml index 4a67181b032..890687e10fd 100644 --- a/.github/workflows/packages.yml +++ b/.github/workflows/packages.yml @@ -49,7 +49,7 @@ jobs: fail-fast: false matrix: php: ["7.4", "8.0"] - symfony: ["^4.4", "5.2.*"] + symfony: ["^4.4", "5.2.*", "5.3.*", "5.4.*"] package: "${{ fromJson(needs.list.outputs.packages) }}" steps: diff --git a/psalm.xml b/psalm.xml index 6a3b1a02d0f..341583d2a8d 100644 --- a/psalm.xml +++ b/psalm.xml @@ -119,6 +119,7 @@ + @@ -202,6 +203,7 @@ + @@ -225,6 +227,7 @@ + diff --git a/src/Sylius/Behat/Service/SecurityService.php b/src/Sylius/Behat/Service/SecurityService.php index 3afef083348..6c2baa63dbb 100644 --- a/src/Sylius/Behat/Service/SecurityService.php +++ b/src/Sylius/Behat/Service/SecurityService.php @@ -43,7 +43,13 @@ public function __construct(SessionInterface $session, CookieSetterInterface $co public function logIn(UserInterface $user): void { - $token = new UsernamePasswordToken($user, $user->getPassword(), $this->firewallContextName, $user->getRoles()); + /** @deprecated parameter credential was deprecated in Symfony 5.4, so in Sylius 1.11 too, in Sylius 2.0 providing 4 arguments will be prohibited. */ + if (3 === (new \ReflectionClass(UsernamePasswordToken::class))->getConstructor()->getNumberOfParameters()) { + $token = new UsernamePasswordToken($user, $this->firewallContextName, $user->getRoles()); + } else { + $token = new UsernamePasswordToken($user, $user->getPassword(), $this->firewallContextName, $user->getRoles()); + } + $this->setToken($token); } diff --git a/src/Sylius/Bundle/AddressingBundle/composer.json b/src/Sylius/Bundle/AddressingBundle/composer.json index 375fc301212..dbbd169e8ad 100644 --- a/src/Sylius/Bundle/AddressingBundle/composer.json +++ b/src/Sylius/Bundle/AddressingBundle/composer.json @@ -31,7 +31,7 @@ "sylius/addressing": "^1.6", "sylius/resource-bundle": "^1.7", "symfony/framework-bundle": "^4.4 || ^5.2", - "symfony/intl": "^4.4 || ^5.2" + "symfony/intl": "^4.4 || ^5.4" }, "conflict": { "twig/twig": "^1.0 || ^3.0" @@ -44,7 +44,7 @@ "symfony/browser-kit": "^4.4 || ^5.2", "symfony/dependency-injection": "^4.4 || ^5.2", "symfony/form": "^4.4 || ^5.2", - "symfony/validator": "^4.4 || ^5.2" + "symfony/validator": "^4.4 || ^5.4" }, "config": { "bin-dir": "bin" diff --git a/src/Sylius/Bundle/AdminBundle/composer.json b/src/Sylius/Bundle/AdminBundle/composer.json index 3775e61b0d3..e6066e2fcbf 100644 --- a/src/Sylius/Bundle/AdminBundle/composer.json +++ b/src/Sylius/Bundle/AdminBundle/composer.json @@ -40,7 +40,7 @@ "require-dev": { "phpspec/phpspec": "^7.0", "phpunit/phpunit": "^8.5", - "symfony/dependency-injection": "^4.4 || ^5.2" + "symfony/dependency-injection": "^4.4 || ^5.4" }, "config": { "bin-dir": "bin" diff --git a/src/Sylius/Bundle/ApiBundle/Controller/Payment/GetPaymentConfiguration.php b/src/Sylius/Bundle/ApiBundle/Controller/Payment/GetPaymentConfiguration.php index ad2ad8dbae2..79086fcb86e 100644 --- a/src/Sylius/Bundle/ApiBundle/Controller/Payment/GetPaymentConfiguration.php +++ b/src/Sylius/Bundle/ApiBundle/Controller/Payment/GetPaymentConfiguration.php @@ -38,7 +38,10 @@ public function __construct( public function __invoke(Request $request): JsonResponse { /** @var PaymentInterface|null $payment */ - $payment = $this->paymentRepository->findOneByOrderToken($request->get('paymentId'), $request->get('id')); + $payment = $this->paymentRepository->findOneByOrderToken( + $request->attributes->get('paymentId'), + $request->attributes->get('id') + ); Assert::notNull($payment); diff --git a/src/Sylius/Bundle/ApiBundle/Controller/UploadAvatarImageAction.php b/src/Sylius/Bundle/ApiBundle/Controller/UploadAvatarImageAction.php index 450eab7f456..02414b4719e 100644 --- a/src/Sylius/Bundle/ApiBundle/Controller/UploadAvatarImageAction.php +++ b/src/Sylius/Bundle/ApiBundle/Controller/UploadAvatarImageAction.php @@ -57,7 +57,7 @@ public function __invoke(Request $request): ImageInterface $image->setFile($file); /** @var string $ownerIri */ - $ownerIri = $request->get('owner'); + $ownerIri = $request->request->get('owner'); Assert::notEmpty($ownerIri); /** @var ResourceInterface|AdminUserInterface $owner */ diff --git a/src/Sylius/Bundle/ApiBundle/composer.json b/src/Sylius/Bundle/ApiBundle/composer.json index 4c08b9829fe..aa8687cbd59 100644 --- a/src/Sylius/Bundle/ApiBundle/composer.json +++ b/src/Sylius/Bundle/ApiBundle/composer.json @@ -28,7 +28,7 @@ "api-platform/core": "^2.6", "lexik/jwt-authentication-bundle": "^2.6", "sylius/core-bundle": "^1.7", - "symfony/messenger": "^4.4 || ^5.2" + "symfony/messenger": "^4.4 || ^5.4" }, "require-dev": { "matthiasnoback/symfony-config-test": "^4.2", diff --git a/src/Sylius/Bundle/AttributeBundle/composer.json b/src/Sylius/Bundle/AttributeBundle/composer.json index 4e898d0cd9c..05784617e19 100644 --- a/src/Sylius/Bundle/AttributeBundle/composer.json +++ b/src/Sylius/Bundle/AttributeBundle/composer.json @@ -31,7 +31,7 @@ "stof/doctrine-extensions-bundle": "^1.4", "sylius/attribute": "^1.6", "sylius/resource-bundle": "^1.7", - "symfony/framework-bundle": "^4.4 || ^5.2" + "symfony/framework-bundle": "^4.4 || ^5.4" }, "require-dev": { "doctrine/orm": "^2.7", @@ -39,7 +39,7 @@ "phpunit/phpunit": "^8.5", "symfony/browser-kit": "^4.4 || ^5.2", "symfony/dependency-injection": "^4.4 || ^5.2", - "symfony/form": "^4.4 || ^5.2" + "symfony/form": "^4.4 || ^5.4" }, "config": { "bin-dir": "bin" diff --git a/src/Sylius/Bundle/ChannelBundle/composer.json b/src/Sylius/Bundle/ChannelBundle/composer.json index 16abd4b25ac..b67d819d75b 100644 --- a/src/Sylius/Bundle/ChannelBundle/composer.json +++ b/src/Sylius/Bundle/ChannelBundle/composer.json @@ -28,7 +28,7 @@ "php": "^7.4 || ^8.0", "sylius/channel": "^1.6", "sylius/resource-bundle": "^1.7", - "symfony/framework-bundle": "^4.4 || ^5.2" + "symfony/framework-bundle": "^4.4 || ^5.4" }, "require-dev": { "doctrine/orm": "^2.7", diff --git a/src/Sylius/Bundle/CoreBundle/Command/SetupCommand.php b/src/Sylius/Bundle/CoreBundle/Command/SetupCommand.php index 2a055ac5217..4e76e2c112b 100644 --- a/src/Sylius/Bundle/CoreBundle/Command/SetupCommand.php +++ b/src/Sylius/Bundle/CoreBundle/Command/SetupCommand.php @@ -112,7 +112,7 @@ function ($value): string { /** @var ConstraintViolationListInterface $errors */ $errors = $this->getContainer()->get('validator')->validate((string) $value, [new Email(), new NotBlank()]); foreach ($errors as $error) { - throw new \DomainException($error->getMessage()); + throw new \DomainException((string) $error->getMessage()); } return $value; @@ -191,7 +191,7 @@ function ($value): string { /** @var ConstraintViolationListInterface $errors */ $errors = $this->getContainer()->get('validator')->validate($value, [new NotBlank()]); foreach ($errors as $error) { - throw new \DomainException($error->getMessage()); + throw new \DomainException((string) $error->getMessage()); } return $value; diff --git a/src/Sylius/Bundle/CoreBundle/Controller/ProductTaxonController.php b/src/Sylius/Bundle/CoreBundle/Controller/ProductTaxonController.php index d060dbcf50a..5de2e5ae817 100644 --- a/src/Sylius/Bundle/CoreBundle/Controller/ProductTaxonController.php +++ b/src/Sylius/Bundle/CoreBundle/Controller/ProductTaxonController.php @@ -30,13 +30,14 @@ class ProductTaxonController extends ResourceController * @throws HttpException * * @deprecated This ajax action is deprecated and will be removed in Sylius 2.0 - use ProductTaxonController::updateProductTaxonsPositionsAction instead. + * + * @psalm-suppress DeprecatedMethod */ public function updatePositionsAction(Request $request): Response { $configuration = $this->requestConfigurationFactory->create($this->metadata, $request); $this->isGrantedOr403($configuration, ResourceActions::UPDATE); - $productTaxons = $request->get('productTaxons'); - + $productTaxons = $this->getParameterFromRequest($request,'productTaxons'); $this->validateCsrfProtection($request, $configuration); if ($this->shouldProductsPositionsBeUpdated($request, $productTaxons)) { @@ -55,11 +56,14 @@ public function updatePositionsAction(Request $request): Response return new JsonResponse(); } + /** + * @psalm-suppress DeprecatedMethod + */ public function updateProductTaxonsPositionsAction(Request $request): Response { $configuration = $this->requestConfigurationFactory->create($this->metadata, $request); $this->isGrantedOr403($configuration, ResourceActions::UPDATE); - $productTaxons = $request->get('productTaxons'); + $productTaxons = $this->getParameterFromRequest($request,'productTaxons'); $this->validateCsrfProtection($request, $configuration); @@ -103,4 +107,27 @@ private function updatePositions(string $position, int $id): void $productTaxonFromBase = $this->repository->findOneBy(['id' => $id]); $productTaxonFromBase->setPosition((int) $position); } + + /** + * @return mixed + * + * @deprecated This function will be removed in Sylius 2.0, since Symfony 5.4, use explicit input sources instead + * based on Symfony\Component\HttpFoundation\Request::get + */ + private function getParameterFromRequest(Request $request, string $key) + { + if ($request !== $result = $request->attributes->get($key, $request)) { + return $result; + } + + if ($request->query->has($key)) { + return $request->query->all()[$key]; + } + + if ($request->request->has($key)) { + return $request->request->all()[$key]; + } + + return null; + } } diff --git a/src/Sylius/Bundle/CoreBundle/Controller/ProductVariantController.php b/src/Sylius/Bundle/CoreBundle/Controller/ProductVariantController.php index 10cb62d5d6a..2e1bd17e763 100644 --- a/src/Sylius/Bundle/CoreBundle/Controller/ProductVariantController.php +++ b/src/Sylius/Bundle/CoreBundle/Controller/ProductVariantController.php @@ -25,12 +25,13 @@ class ProductVariantController extends ResourceController { /** * @throws HttpException + * @psalm-suppress DeprecatedMethod */ public function updatePositionsAction(Request $request): Response { $configuration = $this->requestConfigurationFactory->create($this->metadata, $request); $this->isGrantedOr403($configuration, ResourceActions::UPDATE); - $productVariantsToUpdate = $request->get('productVariants'); + $productVariantsToUpdate = $this->getParameterFromRequest($request, 'productVariants'); if ($configuration->isCsrfProtectionEnabled() && !$this->isCsrfTokenValid('update-product-variant-position', (string) $request->request->get('_csrf_token'))) { throw new HttpException(Response::HTTP_FORBIDDEN, 'Invalid csrf token.'); @@ -54,4 +55,27 @@ public function updatePositionsAction(Request $request): Response return new JsonResponse(); } + + /** + * @return mixed + * + * @deprecated This function will be removed in Sylius 2.0, since Symfony 5.4, use explicit input sources instead + * based on Symfony\Component\HttpFoundation\Request::get + */ + private function getParameterFromRequest(Request $request, string $key) + { + if ($request !== $result = $request->attributes->get($key, $request)) { + return $result; + } + + if ($request->query->has($key)) { + return $request->query->all()[$key]; + } + + if ($request->request->has($key)) { + return $request->request->all()[$key]; + } + + return null; + } } diff --git a/src/Sylius/Bundle/CoreBundle/Resources/config/services.xml b/src/Sylius/Bundle/CoreBundle/Resources/config/services.xml index ad56e78531e..58494482a3d 100644 --- a/src/Sylius/Bundle/CoreBundle/Resources/config/services.xml +++ b/src/Sylius/Bundle/CoreBundle/Resources/config/services.xml @@ -243,5 +243,7 @@ + + diff --git a/src/Sylius/Bundle/CoreBundle/Security/UserImpersonator.php b/src/Sylius/Bundle/CoreBundle/Security/UserImpersonator.php index f5906f18101..9fcce049727 100644 --- a/src/Sylius/Bundle/CoreBundle/Security/UserImpersonator.php +++ b/src/Sylius/Bundle/CoreBundle/Security/UserImpersonator.php @@ -40,12 +40,22 @@ public function __construct(SessionInterface $session, string $firewallContextNa public function impersonate(UserInterface $user): void { - $token = new UsernamePasswordToken( - $user, - $user->getPassword(), - $this->firewallContextName, - array_map(/** @param object|string $role */ static function ($role): string { return (string) $role; }, $user->getRoles()) - ); + /** @deprecated parameter credential was deprecated in Symfony 5.4, so in Sylius 1.11 too, in Sylius 2.0 providing 4 arguments will be prohibited. */ + if (3 === (new \ReflectionClass(UsernamePasswordToken::class))->getConstructor()->getNumberOfParameters()) { + $token = new UsernamePasswordToken( + $user, + $this->firewallContextName, + array_map(/** @param object|string $role */ static function ($role): string { return (string) $role; }, $user->getRoles()) + ); + } else { + $token = new UsernamePasswordToken( + $user, + $user->getPassword(), + $this->firewallContextName, + array_map(/** @param object|string $role */ static function ($role): string { return (string) $role; }, $user->getRoles()) + ); + } + $this->session->set($this->sessionTokenParameter, serialize($token)); $this->session->save(); diff --git a/src/Sylius/Bundle/CoreBundle/composer.json b/src/Sylius/Bundle/CoreBundle/composer.json index 02c068c7fbe..d17064abb1f 100644 --- a/src/Sylius/Bundle/CoreBundle/composer.json +++ b/src/Sylius/Bundle/CoreBundle/composer.json @@ -77,7 +77,7 @@ "matthiasnoback/symfony-dependency-injection-test": "^4.2", "phpspec/phpspec": "^7.0", "phpunit/phpunit": "^8.5", - "symfony/dependency-injection": "^4.4 || ^5.2" + "symfony/dependency-injection": "^4.4 || ^5.4" }, "conflict": { "symfony/doctrine-bridge": "4.4.20 || 5.2.4 || 5.2.5" diff --git a/src/Sylius/Bundle/CurrencyBundle/composer.json b/src/Sylius/Bundle/CurrencyBundle/composer.json index 73a3e5cb21c..10d297b7c3a 100644 --- a/src/Sylius/Bundle/CurrencyBundle/composer.json +++ b/src/Sylius/Bundle/CurrencyBundle/composer.json @@ -30,7 +30,7 @@ "sylius/resource-bundle": "^1.7", "symfony/framework-bundle": "^4.4 || ^5.2", "symfony/intl": "^4.4 || ^5.2", - "symfony/templating": "^4.4 || ^5.2" + "symfony/templating": "^4.4 || ^5.4" }, "conflict": { "twig/twig": "^1.0" diff --git a/src/Sylius/Bundle/CustomerBundle/composer.json b/src/Sylius/Bundle/CustomerBundle/composer.json index b59bce286e9..ef25c628862 100644 --- a/src/Sylius/Bundle/CustomerBundle/composer.json +++ b/src/Sylius/Bundle/CustomerBundle/composer.json @@ -52,7 +52,7 @@ "polishsymfonycommunity/symfony-mocker-container": "^1.0", "symfony/browser-kit": "^4.4 || ^5.2", "symfony/dependency-injection": "^4.4 || ^5.2", - "symfony/form": "^4.4 || ^5.2" + "symfony/form": "^4.4 || ^5.4" }, "config": { "bin-dir": "bin" diff --git a/src/Sylius/Bundle/InventoryBundle/composer.json b/src/Sylius/Bundle/InventoryBundle/composer.json index d9855758723..d65c6eeace0 100644 --- a/src/Sylius/Bundle/InventoryBundle/composer.json +++ b/src/Sylius/Bundle/InventoryBundle/composer.json @@ -31,7 +31,7 @@ "sylius/resource-bundle": "^1.7", "symfony/framework-bundle": "^4.4 || ^5.2", "symfony/templating": "^4.4 || ^5.2", - "symfony/validator": "^4.4 || ^5.2" + "symfony/validator": "^4.4 || ^5.4" }, "conflict": { "twig/twig": "^1.0" diff --git a/src/Sylius/Bundle/LocaleBundle/composer.json b/src/Sylius/Bundle/LocaleBundle/composer.json index f4a172a5a54..4ce406747b5 100644 --- a/src/Sylius/Bundle/LocaleBundle/composer.json +++ b/src/Sylius/Bundle/LocaleBundle/composer.json @@ -30,7 +30,7 @@ "sylius/locale": "^1.6", "sylius/resource-bundle": "^1.7", "symfony/framework-bundle": "^4.4 || ^5.2", - "symfony/templating": "^4.4 || ^5.2" + "symfony/templating": "^4.4 || ^5.4" }, "conflict": { "twig/twig": "^1.0" diff --git a/src/Sylius/Bundle/OrderBundle/Controller/OrderController.php b/src/Sylius/Bundle/OrderBundle/Controller/OrderController.php index 81ced8533e3..3cc77ed3874 100644 --- a/src/Sylius/Bundle/OrderBundle/Controller/OrderController.php +++ b/src/Sylius/Bundle/OrderBundle/Controller/OrderController.php @@ -127,6 +127,9 @@ public function saveAction(Request $request): Response ); } + /** + * @psalm-suppress DeprecatedMethod + */ public function clearAction(Request $request): Response { $configuration = $this->requestConfigurationFactory->create($this->metadata, $request); @@ -134,7 +137,7 @@ public function clearAction(Request $request): Response $this->isGrantedOr403($configuration, ResourceActions::DELETE); $resource = $this->getCurrentCart(); - if ($configuration->isCsrfProtectionEnabled() && !$this->isCsrfTokenValid((string) $resource->getId(), $request->get('_csrf_token'))) { + if ($configuration->isCsrfProtectionEnabled() && !$this->isCsrfTokenValid((string) $resource->getId(), $this->getParameterFromRequest($request, '_csrf_token'))) { throw new HttpException(Response::HTTP_FORBIDDEN, 'Invalid csrf token.'); } @@ -194,4 +197,27 @@ protected function getEventDispatcher(): EventDispatcherInterface { return $this->container->get('event_dispatcher'); } + + /** + * @return mixed + * + * @deprecated This function will be removed in Sylius 2.0, since Symfony 5.4, use explicit input sources instead + * based on Symfony\Component\HttpFoundation\Request::get + */ + private function getParameterFromRequest(Request $request, string $key) + { + if ($request !== $result = $request->attributes->get($key, $request)) { + return $result; + } + + if ($request->query->has($key)) { + return $request->query->all()[$key]; + } + + if ($request->request->has($key)) { + return $request->request->all()[$key]; + } + + return null; + } } diff --git a/src/Sylius/Bundle/OrderBundle/composer.json b/src/Sylius/Bundle/OrderBundle/composer.json index 0f9101dd476..65aed92a7e2 100644 --- a/src/Sylius/Bundle/OrderBundle/composer.json +++ b/src/Sylius/Bundle/OrderBundle/composer.json @@ -34,7 +34,7 @@ "sylius/order": "^1.6", "sylius/resource-bundle": "^1.7", "symfony/framework-bundle": "^4.4 || ^5.2", - "symfony/templating": "^4.4 || ^5.2" + "symfony/templating": "^4.4 || ^5.4" }, "conflict": { "twig/twig": "^1.0 || ^3.0" @@ -46,7 +46,7 @@ "phpunit/phpunit": "^8.5", "symfony/browser-kit": "^4.4 || ^5.2", "symfony/form": "^4.4 || ^5.2", - "symfony/validator": "^4.4 || ^5.2" + "symfony/validator": "^4.4 || ^5.4" }, "config": { "bin-dir": "bin" diff --git a/src/Sylius/Bundle/PaymentBundle/composer.json b/src/Sylius/Bundle/PaymentBundle/composer.json index 5230ca12aa2..7d5b37deaf4 100644 --- a/src/Sylius/Bundle/PaymentBundle/composer.json +++ b/src/Sylius/Bundle/PaymentBundle/composer.json @@ -29,7 +29,7 @@ "php": "^7.4 || ^8.0", "sylius/payment": "^1.6", "sylius/resource-bundle": "^1.7", - "symfony/framework-bundle": "^4.4 || ^5.2" + "symfony/framework-bundle": "^4.4 || ^5.4" }, "conflict": { "twig/twig": "^3.0" @@ -42,7 +42,7 @@ "polishsymfonycommunity/symfony-mocker-container": "^1.0", "sylius/locale-bundle": "^1.6", "symfony/browser-kit": "^4.4 || ^5.2", - "symfony/dependency-injection": "^4.4 || ^5.2" + "symfony/dependency-injection": "^4.4 || ^5.4" }, "config": { "bin-dir": "bin" diff --git a/src/Sylius/Bundle/PayumBundle/composer.json b/src/Sylius/Bundle/PayumBundle/composer.json index ddee02e4acf..5ff41991324 100644 --- a/src/Sylius/Bundle/PayumBundle/composer.json +++ b/src/Sylius/Bundle/PayumBundle/composer.json @@ -40,7 +40,7 @@ }, "require-dev": { "phpspec/phpspec": "^7.0", - "symfony/dependency-injection": "^4.4 || ^5.2" + "symfony/dependency-injection": "^4.4 || ^5.4" }, "config": { "bin-dir": "bin" diff --git a/src/Sylius/Bundle/ProductBundle/Controller/ProductSlugController.php b/src/Sylius/Bundle/ProductBundle/Controller/ProductSlugController.php index 355557b9e5c..9403b53754c 100644 --- a/src/Sylius/Bundle/ProductBundle/Controller/ProductSlugController.php +++ b/src/Sylius/Bundle/ProductBundle/Controller/ProductSlugController.php @@ -13,6 +13,7 @@ namespace Sylius\Bundle\ProductBundle\Controller; +use Sylius\Component\Product\Generator\SlugGeneratorInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; @@ -20,10 +21,30 @@ class ProductSlugController extends AbstractController { + private ?SlugGeneratorInterface $slugGenerator; + + public function __construct(?SlugGeneratorInterface $slugGenerator = null) + { + $this->slugGenerator = $slugGenerator; + + if ($this->slugGenerator === null) { + @trigger_error(sprintf('Not passing a $slugGenerator to %s constructor is deprecated since Sylius 1.11 and will be prohibited in Sylius 2.0.', self::class), \E_USER_DEPRECATED); + } + } + + /** + * @psalm-suppress DeprecatedMethod + */ public function generateAction(Request $request): Response { $name = $request->query->get('name'); + if ($this->slugGenerator !== null) { + return new JsonResponse([ + 'slug' => $this->slugGenerator->generate((string) $name), + ]); + } + return new JsonResponse([ 'slug' => $this->get('sylius.generator.slug')->generate($name), ]); diff --git a/src/Sylius/Bundle/ProductBundle/Resources/config/services.xml b/src/Sylius/Bundle/ProductBundle/Resources/config/services.xml index 7738691542c..b6ea78c47d3 100644 --- a/src/Sylius/Bundle/ProductBundle/Resources/config/services.xml +++ b/src/Sylius/Bundle/ProductBundle/Resources/config/services.xml @@ -20,6 +20,7 @@ + diff --git a/src/Sylius/Bundle/ProductBundle/composer.json b/src/Sylius/Bundle/ProductBundle/composer.json index 7ded48b857f..88e93bec7c7 100644 --- a/src/Sylius/Bundle/ProductBundle/composer.json +++ b/src/Sylius/Bundle/ProductBundle/composer.json @@ -32,7 +32,7 @@ "sylius/locale-bundle": "^1.6", "sylius/product": "^1.6", "sylius/resource-bundle": "^1.7", - "symfony/framework-bundle": "^4.4 || ^5.2" + "symfony/framework-bundle": "^4.4 || ^5.4" }, "require-dev": { "doctrine/orm": "^2.7", @@ -42,7 +42,7 @@ "symfony/browser-kit": "^4.4 || ^5.2", "symfony/dependency-injection": "^4.4 || ^5.2", "symfony/form": "^4.4 || ^5.2", - "symfony/validator": "^4.4 || ^5.2" + "symfony/validator": "^4.4 || ^5.4" }, "config": { "bin-dir": "bin" diff --git a/src/Sylius/Bundle/PromotionBundle/composer.json b/src/Sylius/Bundle/PromotionBundle/composer.json index 07c53e73bfb..e309ed0a328 100644 --- a/src/Sylius/Bundle/PromotionBundle/composer.json +++ b/src/Sylius/Bundle/PromotionBundle/composer.json @@ -33,7 +33,7 @@ "sylius/promotion": "^1.6", "sylius/registry": "^1.5", "sylius/resource-bundle": "^1.7", - "symfony/framework-bundle": "^4.4 || ^5.2" + "symfony/framework-bundle": "^4.4 || ^5.4" }, "conflict": { "twig/twig": "^3.0" @@ -47,7 +47,7 @@ "symfony/browser-kit": "^4.4 || ^5.2", "symfony/dependency-injection": "^4.4 || ^5.2", "symfony/form": "^4.4 || ^5.2", - "symfony/validator": "^4.4 || ^5.2" + "symfony/validator": "^4.4 || ^5.4" }, "config": { "bin-dir": "bin" diff --git a/src/Sylius/Bundle/ReviewBundle/composer.json b/src/Sylius/Bundle/ReviewBundle/composer.json index f3ba2311ff7..176da87aeae 100644 --- a/src/Sylius/Bundle/ReviewBundle/composer.json +++ b/src/Sylius/Bundle/ReviewBundle/composer.json @@ -44,7 +44,7 @@ "sylius/resource-bundle": "^1.7", "sylius/review": "^1.6", "sylius/user-bundle": "^1.6", - "symfony/framework-bundle": "^4.4 || ^5.2" + "symfony/framework-bundle": "^4.4 || ^5.4" }, "conflict": { "twig/twig": "^3.0" diff --git a/src/Sylius/Bundle/ShippingBundle/composer.json b/src/Sylius/Bundle/ShippingBundle/composer.json index e41cd1e7864..5cf6ad964c1 100644 --- a/src/Sylius/Bundle/ShippingBundle/composer.json +++ b/src/Sylius/Bundle/ShippingBundle/composer.json @@ -33,7 +33,7 @@ "sylius/money-bundle": "^1.6", "sylius/resource-bundle": "^1.7", "sylius/shipping": "^1.6", - "symfony/framework-bundle": "^4.4 || ^5.2" + "symfony/framework-bundle": "^4.4 || ^5.4" }, "conflict": { "twig/twig": "^3.0" @@ -47,7 +47,7 @@ "symfony/browser-kit": "^4.4 || ^5.2", "symfony/dependency-injection": "^4.4 || ^5.2", "symfony/form": "^4.4 || ^5.2", - "symfony/validator": "^4.4 || ^5.2" + "symfony/validator": "^4.4 || ^5.4" }, "config": { "bin-dir": "bin" diff --git a/src/Sylius/Bundle/ShopBundle/composer.json b/src/Sylius/Bundle/ShopBundle/composer.json index dfa4a9dc2e1..3e6c86f9436 100644 --- a/src/Sylius/Bundle/ShopBundle/composer.json +++ b/src/Sylius/Bundle/ShopBundle/composer.json @@ -40,7 +40,7 @@ "mockery/mockery": "^1.4", "phpspec/phpspec": "^7.0", "phpunit/phpunit": "^8.5", - "symfony/dependency-injection": "^4.4 || ^5.2" + "symfony/dependency-injection": "^4.4 || ^5.4" }, "config": { "bin-dir": "bin" diff --git a/src/Sylius/Bundle/TaxationBundle/composer.json b/src/Sylius/Bundle/TaxationBundle/composer.json index d268d315195..99e9ab9f5ad 100644 --- a/src/Sylius/Bundle/TaxationBundle/composer.json +++ b/src/Sylius/Bundle/TaxationBundle/composer.json @@ -32,7 +32,7 @@ "sylius/registry": "^1.5", "sylius/resource-bundle": "^1.7", "sylius/taxation": "^1.6", - "symfony/framework-bundle": "^4.4 || ^5.2" + "symfony/framework-bundle": "^4.4 || ^5.4" }, "conflict": { "twig/twig": "^3.0" @@ -45,7 +45,7 @@ "polishsymfonycommunity/symfony-mocker-container": "^1.0", "symfony/browser-kit": "^4.4 || ^5.2", "symfony/dependency-injection": "^4.4 || ^5.2", - "symfony/form": "^4.4 || ^5.2" + "symfony/form": "^4.4 || ^5.4" }, "config": { "bin-dir": "bin" diff --git a/src/Sylius/Bundle/TaxonomyBundle/composer.json b/src/Sylius/Bundle/TaxonomyBundle/composer.json index 1baa305968a..fa6e29fc5ad 100644 --- a/src/Sylius/Bundle/TaxonomyBundle/composer.json +++ b/src/Sylius/Bundle/TaxonomyBundle/composer.json @@ -32,7 +32,7 @@ "stof/doctrine-extensions-bundle": "^1.4", "sylius/resource-bundle": "^1.7", "sylius/taxonomy": "^1.6", - "symfony/framework-bundle": "^4.4 || ^5.2" + "symfony/framework-bundle": "^4.4 || ^5.4" }, "conflict": { "twig/twig": "^3.0" @@ -41,7 +41,7 @@ "doctrine/orm": "^2.7", "phpspec/phpspec": "^7.0", "phpunit/phpunit": "^8.5", - "symfony/dependency-injection": "^4.4 || ^5.2" + "symfony/dependency-injection": "^4.4 || ^5.4" }, "config": { "bin-dir": "bin" diff --git a/src/Sylius/Bundle/UserBundle/Controller/SecurityController.php b/src/Sylius/Bundle/UserBundle/Controller/SecurityController.php index fac2a1174f9..150cfdd1afc 100644 --- a/src/Sylius/Bundle/UserBundle/Controller/SecurityController.php +++ b/src/Sylius/Bundle/UserBundle/Controller/SecurityController.php @@ -15,18 +15,45 @@ use Sylius\Bundle\UserBundle\Form\Type\UserLoginType; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\Form\FormFactoryInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Security\Http\Authentication\AuthenticationUtils; use Webmozart\Assert\Assert; class SecurityController extends AbstractController { + private ?AuthenticationUtils $authenticationUtils; + + private ?FormFactoryInterface $formFactory; + + public function __construct(?AuthenticationUtils $authenticationUtils = null, ?FormFactoryInterface $formFactory = null) + { + $this->authenticationUtils = $authenticationUtils; + $this->formFactory = $formFactory; + + if ($this->authenticationUtils === null) { + @trigger_error(sprintf('Not passing a $authenticationUtils to %s constructor is deprecated since Sylius 1.11 and will be prohibited in Sylius 2.0.', self::class), \E_USER_DEPRECATED); + } + + if ($this->formFactory === null) { + @trigger_error(sprintf('Not passing a $formFactory to %s constructor is deprecated since Sylius 1.11 and will be prohibited in Sylius 2.0.', self::class), \E_USER_DEPRECATED); + } + } + /** * Login form action. + * + * @psalm-suppress DeprecatedMethod */ public function loginAction(Request $request): Response { - $authenticationUtils = $this->get('security.authentication_utils'); + if ($this->authenticationUtils !== null) { + $authenticationUtils = $this->authenticationUtils; + } else { + $authenticationUtils = $this->get('security.authentication_utils'); + } + $error = $authenticationUtils->getLastAuthenticationError(); $lastUsername = $authenticationUtils->getLastUsername(); @@ -36,7 +63,12 @@ public function loginAction(Request $request): Response Assert::notNull($template, 'Template is not configured.'); $formType = $options['form'] ?? UserLoginType::class; - $form = $this->get('form.factory')->createNamed('', $formType); + + if ($this->formFactory !== null) { + $form = $this->formFactory->createNamed('', $formType); + } else { + $form = $this->get('form.factory')->createNamed('', $formType); + } return $this->render($template, [ 'form' => $form->createView(), diff --git a/src/Sylius/Bundle/UserBundle/Resources/config/services.xml b/src/Sylius/Bundle/UserBundle/Resources/config/services.xml index 09b04539d3e..6a9c3c4e31f 100644 --- a/src/Sylius/Bundle/UserBundle/Resources/config/services.xml +++ b/src/Sylius/Bundle/UserBundle/Resources/config/services.xml @@ -40,6 +40,8 @@ + + diff --git a/src/Sylius/Bundle/UserBundle/Security/UserLogin.php b/src/Sylius/Bundle/UserBundle/Security/UserLogin.php index af8fe52b807..60337c95785 100644 --- a/src/Sylius/Bundle/UserBundle/Security/UserLogin.php +++ b/src/Sylius/Bundle/UserBundle/Security/UserLogin.php @@ -58,6 +58,15 @@ public function login(UserInterface $user, ?string $firewallName = null): void protected function createToken(UserInterface $user, string $firewallName): UsernamePasswordToken { + /** @deprecated parameter credential was deprecated in Symfony 5.4, so in Sylius 1.11 too, in Sylius 2.0 providing 4 arguments will be prohibited. */ + if (3 === (new \ReflectionClass(UsernamePasswordToken::class))->getConstructor()->getNumberOfParameters()) { + return new UsernamePasswordToken( + $user, + $firewallName, + array_map(/** @param object|string $role */ static function ($role): string { return (string) $role; }, $user->getRoles()) + ); + } + return new UsernamePasswordToken( $user, null, diff --git a/src/Sylius/Component/Addressing/composer.json b/src/Sylius/Component/Addressing/composer.json index 636771c5d92..2396ec8c601 100644 --- a/src/Sylius/Component/Addressing/composer.json +++ b/src/Sylius/Component/Addressing/composer.json @@ -29,7 +29,7 @@ "php": "^7.4 || ^8.0", "sylius/registry": "^1.5", "sylius/resource": "^1.7", - "symfony/intl": "^4.4 || ^5.2" + "symfony/intl": "^4.4 || ^5.4" }, "require-dev": { "phpspec/phpspec": "^7.0" diff --git a/src/Sylius/Component/Attribute/composer.json b/src/Sylius/Component/Attribute/composer.json index e10e062bee1..3bba74e4226 100644 --- a/src/Sylius/Component/Attribute/composer.json +++ b/src/Sylius/Component/Attribute/composer.json @@ -29,7 +29,7 @@ "doctrine/collections": "^1.6", "sylius/registry": "^1.5", "sylius/resource": "^1.7", - "symfony/validator": "^4.4 || ^5.2" + "symfony/validator": "^4.4 || ^5.4" }, "require-dev": { "phpspec/phpspec": "^7.0" diff --git a/src/Sylius/Component/Core/composer.json b/src/Sylius/Component/Core/composer.json index 0cd4068b02b..dc23d7c04a0 100644 --- a/src/Sylius/Component/Core/composer.json +++ b/src/Sylius/Component/Core/composer.json @@ -56,7 +56,7 @@ }, "require-dev": { "phpspec/phpspec": "^7.0", - "symfony/property-access": "^4.4 || ^5.2" + "symfony/property-access": "^4.4 || ^5.4" }, "config": { "bin-dir": "bin" diff --git a/src/Sylius/Component/Shipping/composer.json b/src/Sylius/Component/Shipping/composer.json index 3853e4ae6d7..60c95390f38 100644 --- a/src/Sylius/Component/Shipping/composer.json +++ b/src/Sylius/Component/Shipping/composer.json @@ -31,7 +31,7 @@ "php": "^7.4 || ^8.0", "sylius/registry": "^1.5", "sylius/resource": "^1.7", - "symfony/options-resolver": "^4.4 || ^5.2" + "symfony/options-resolver": "^4.4 || ^5.4" }, "require-dev": { "phpspec/phpspec": "^7.0" diff --git a/src/Sylius/Component/User/composer.json b/src/Sylius/Component/User/composer.json index 802bc38103c..6bf4a3f03bf 100644 --- a/src/Sylius/Component/User/composer.json +++ b/src/Sylius/Component/User/composer.json @@ -38,7 +38,7 @@ "sylius-labs/polyfill-symfony-security": "^1.0", "sylius/resource": "^1.7", "symfony/polyfill-mbstring": "^1.17", - "symfony/security-core": "^4.4 || ^5.2" + "symfony/security-core": "^4.4 || ^5.4" }, "require-dev": { "phpspec/phpspec": "^7.0" diff --git a/tests/Controller/AdminProductAjaxTest.php b/tests/Controller/AdminProductAjaxTest.php index 5aa8a62e1fc..3e7139b39b6 100644 --- a/tests/Controller/AdminProductAjaxTest.php +++ b/tests/Controller/AdminProductAjaxTest.php @@ -65,7 +65,14 @@ private function authenticateAdminUser(): void $session = self::$container->get('session'); $firewallName = 'admin'; $firewallContext = 'admin'; - $token = new UsernamePasswordToken($user, null, $firewallName, $user->getRoles()); + + /** @deprecated parameter credential was deprecated in Symfony 5.4, so in Sylius 1.11 too, in Sylius 2.0 providing 4 arguments will be prohibited. */ + if (3 === (new \ReflectionClass(UsernamePasswordToken::class))->getConstructor()->getNumberOfParameters()) { + $token = new UsernamePasswordToken($user, $firewallName, $user->getRoles()); + } else { + $token = new UsernamePasswordToken($user, null, $firewallName, $user->getRoles()); + } + $session->set(sprintf('_security_%s', $firewallContext), serialize($token)); $session->save();