Sylius 1.13.12 introduces anonymous telemetry to help us understand how Sylius is used and improve the platform.
What data is collected:
- Anonymous installation ID (hashed, non-reversible)
- Sylius and PHP versions, default locale
- Aggregated statistics as segments (broad ranges, not exact values):
- Customers/products/variants count (e.g., "1K-10K", "100K-1M")
- GMV and AOV ranges per month (e.g., "100K-500K", "50-100")
No sensitive data is ever collected - no customer information, no order details, no personal data.
Configuration:
Telemetry is enabled by default and uses a default salt for hashing the installation ID.
To disable telemetry, set the following environment variable in your .env file:
SYLIUS_TELEMETRY_ENABLED=0To change the salt, set the SYLIUS_TELEMETRY_SALT environment variable:
SYLIUS_TELEMETRY_SALT=your-custom-saltDatabase migration (optional):
This release includes an optional database migration that adds an index to improve telemetry query performance. The telemetry system works without this index, but adding it will make data collection faster, especially for stores with large order volumes.
To run the migration:
php bin/console doctrine:migrations:migrateIf you want to skip this migration:
php bin/console doctrine:migrations:version 'Sylius\Bundle\CoreBundle\Migrations\Version20251126120000' --add --no-interaction
# For PostgreSQL:
php bin/console doctrine:migrations:version 'Sylius\Bundle\CoreBundle\Migrations\Version20251126120001' --add --no-interactionFor more details, see the Telemetry documentation.
- The
sylius.product_review.average_rating_updaterhas changed itsdoctrine.event_listenerevent frompostRemovetopreRemove.
-
Due to a bug that was causing wrong calculation of available stock during completing a payment REF, The constructor of
Sylius\Bundle\CoreBundle\EventListener\PaymentPreCompleteListenerhas been modified as follows:public function __construct( + private OrderItemAvailabilityCheckerInterface|AvailabilityCheckerInterface $availabilityChecker, - private AvailabilityCheckerInterface $availabilityChecker, )
If you have overwritten the service or its argument, check the correct functioning.
Sylius 1.13 comes with a bump of minimum PHP version to 8.1. We strongly advice to make upgrade process step by step, so it is highly recommended to update your PHP version while being still on Sylius 1.12. After ensuring, that the previous step succeeds, you may move forward to the Sylius 1.13 update.
The minimum supported version of Symfony 6 has been bumped up to 6.4. Sylius 1.13 supports both long-term supported Symfony versions: 5.4 and 6.4.
Starting with Sylius 1.13, the functionality of SyliusPriceHistoryPlugin is included in Core. If you are currently using the plugin in your project, we recommend following the upgrade guide located here.
To ease the update process, we have grouped the changes into the following categories:
-
Starting with Sylius
1.13we provided a possibility to use the Symfony Workflow as your State Machine. To allow a smooth transition we created a new package calledsylius/state-machine-abstraction, which provides a configurable abstraction, allowing you to define which adapter should be used (Winzou State Machine or Symfony Workflow) per graph. -
The use of
sylius/calendarpackage is deprecated in favor ofsymfony/clockpackage globally. -
The
payum/payumpackage has been replaced by concrete packages likepayum/core,payum/offlineorpayum/paypal-express-checkout-nvp. If you need any other component so far provided bypayum/payumpackage, you need to install it explicitly.
-
The following AdminBundle constructor signatures have been changed:
Sylius\Bundle\AdminBundle\Action\ResendOrderConfirmationEmailActionuse Sylius\Bundle\AdminBundle\EmailManager\OrderEmailManagerInterface; use Sylius\Bundle\CoreBundle\MessageDispatcher\ResendOrderConfirmationEmailDispatcherInterface; public function __construct( OrderRepositoryInterface $orderRepository, - OrderEmailManagerInterface $orderEmailManager, + ResendOrderConfirmationEmailDispatcherInterface $orderEmailManager, CsrfTokenManagerInterface $csrfTokenManager, RequestStack $requestStackOrSession, )Starting from Sylius 2.0, the
$orderEmailManagerargument will be renamed to$resendOrderConfirmationEmailDispatcher.Sylius\Bundle\AdminBundle\Action\ResendShipmentConfirmationEmailActionuse Sylius\Bundle\AdminBundle\EmailManager\ShipmentEmailManagerInterface; use Sylius\Bundle\CoreBundle\MessageDispatcher\ResendShipmentConfirmationEmailDispatcherInterface; public function __construct( ShipmentRepositoryInterface $shipmentRepository, - ShipmentEmailManagerInterface $shipmentEmailManager, + ResendShipmentConfirmationEmailDispatcherInterface $shipmentEmailManager, CsrfTokenManagerInterface $csrfTokenManager, RequestStack $requestStackOrSession, )Starting from Sylius 2.0, the
$shipmentEmailManagerargument will be renamed to$resendShipmentConfirmationEmailDispatcher.Sylius\Bundle\AdminBundle\Controller\NotificationControlleruse GuzzleHttp\ClientInterface as DeprecatedClientInterface; use Http\Message\MessageFactory; use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestFactoryInterface; use Psr\Http\Message\StreamFactoryInterface; public function __construct( - DeprecatedClientInterface $client, + ClientInterface $client, - MessageFactory $messageFactory, + RequestFactoryInterface $requestFactory, string $hubUri, string $environment, + StreamFactoryInterface $streamFactory, )Sylius\Bundle\AdminBundle\Controller\ImpersonateUserControlleruse Symfony\Component\Routing\RouterInterface; public function __construct( UserImpersonatorInterface $impersonator, AuthorizationCheckerInterface $authorizationChecker, UserProviderInterface $userProvider, + RouterInterface $router, string $authorizationRole, )Sylius\Bundle\AdminBundle\EventListener\ShipmentShipListeneruse Sylius\Bundle\AdminBundle\EmailManager\ShipmentEmailManagerInterface as DeprecatedShipmentEmailManagerInterface; use Sylius\Bundle\CoreBundle\Mailer\ShipmentEmailManagerInterface; public function __construct( - DeprecatedShipmentEmailManagerInterface $shipmentEmailManager, + ShipmentEmailManagerInterface $shipmentEmailManager, ) -
The following AttributeBundle constructor signature has been changed:
Sylius\Bundle\AttributeBundle\Form\Type\AttributeType\Configuration\SelectAttributeChoicesCollectionTypeuse Sylius\Component\Resource\Translation\Provider\TranslationLocaleProviderInterface; public function __construct( - TranslationLocaleProviderInterface $localeProvider, ) -
The following CoreBundle constructor signatures have been changed:
Sylius\Bundle\CoreBundle\CatalogPromotion\Processor\CatalogPromotionRemovalProcessoruse Sylius\Bundle\CoreBundle\CatalogPromotion\Announcer\CatalogPromotionRemovalAnnouncerInterface; use Symfony\Component\Messenger\MessageBusInterface; public function __construct( private CatalogPromotionRepositoryInterface $catalogPromotionRepository, + private CatalogPromotionRemovalAnnouncerInterface $catalogPromotionRemovalAnnouncer, - private MessageBusInterface $commandBus, - private MessageBusInterface $eventBus, )Sylius\Bundle\CoreBundle\Fixture\Factory\ProductExampleFactoryuse Symfony\Component\Config\FileLocatorInterface; public function __construct( FactoryInterface $productFactory, FactoryInterface $productVariantFactory, FactoryInterface $channelPricingFactory, ProductVariantGeneratorInterface $variantGenerator, FactoryInterface $productAttributeValueFactory, FactoryInterface $productImageFactory, FactoryInterface $productTaxonFactory, ImageUploaderInterface $imageUploader, SlugGeneratorInterface $slugGenerator, RepositoryInterface $taxonRepository, RepositoryInterface $productAttributeRepository, RepositoryInterface $productOptionRepository, RepositoryInterface $channelRepository, RepositoryInterface $localeRepository, RepositoryInterface $taxCategoryRepository, + FileLocatorInterface $fileLocator, )Sylius\Bundle\CoreBundle\Fixture\Factory\PromotionExampleFactoryuse Sylius\Component\Resource\Repository\RepositoryInterface; public function __construct( FactoryInterface $promotionFactory, ExampleFactoryInterface $promotionRuleExampleFactory, ExampleFactoryInterface $promotionActionExampleFactory, ChannelRepositoryInterface $channelRepository, FactoryInterface $couponFactory, + RepositoryInterface $localeRepository, )Sylius\Bundle\CoreBundle\Installer\Provider\DatabaseSetupCommandsProvideruse Doctrine\Bundle\DoctrineBundle\Registry; use Doctrine\ORM\EntityManagerInterface; public function __construct( - Registry $doctrineRegistry, + EntityManagerInterface $entityManager, )Sylius\Bundle\CoreBundle\Installer\Setup\LocaleSetupuse Symfony\Component\Filesystem\Filesystem; public function __construct( RepositoryInterface $localeRepository, FactoryInterface $localeFactory, string $locale, + Filesystem $filesystem, + string $localeParameterFilePath, )Sylius\Bundle\CoreBundle\Message\Admin\Account\ResetPasswordpublic function __construct( - string $resetPasswordToken, + string $token, ?string $newPassword = null, ?string $confirmNewPassword = null, )
Sylius\Bundle\CoreBundle\MessageHandler\Admin\Account\SendResetPasswordEmailHandleruse Sylius\Bundle\CoreBundle\Mailer\ResetPasswordEmailManagerInterface; use Sylius\Component\Mailer\Sender\SenderInterface; public function __construct( private UserRepositoryInterface $shopUserRepository, - private SenderInterface $emailSender, + private ResetPasswordEmailManagerInterface $resetPasswordEmailManager, )Sylius\Bundle\CoreBundle\Validator\Constraints\HasEnabledEntityValidatoruse Symfony\Component\PropertyAccess\PropertyAccessorInterface; public function __construct( ManagerRegistry $registry, + PropertyAccessorInterface $accessor, ) -
The following ShopBundle constructor signatures have been changed:
Sylius\Bundle\ShopBundle\EventListener\OrderCompleteListeneruse Sylius\Bundle\CoreBundle\Mailer\OrderEmailManagerInterface; use Sylius\Bundle\ShopBundle\EmailManager\OrderEmailManagerInterface as DeprecatedOrderEmailManagerInterface; public function __construct( - DeprecatedOrderEmailManagerInterface $orderEmailManager, + OrderEmailManagerInterface $orderEmailManager, )Sylius\Bundle\ShopBundle\Controller\ContactControlleruse Sylius\Bundle\CoreBundle\Mailer\ContactEmailManagerInterface; use Sylius\Bundle\ShopBundle\EmailManager\ContactEmailManagerInterface as DeprecatedContactEmailManagerInterface; public function __construct( RouterInterface $router, FormFactoryInterface $formFactory, Environment $templatingEngine, ChannelContextInterface $channelContext, CustomerContextInterface $customerContext, LocaleContextInterface $localeContext, - DeprecatedContactEmailManagerInterface $contactEmailManager, + ContactEmailManagerInterface $contactEmailManager, ) -
The following components' constructor signatures have been changed:
Sylius\Component\Addressing\Matcher\ZoneMatcheruse Sylius\Component\Addressing\Repository\ZoneRepositoryInterface; use Sylius\Component\Resource\Repository\RepositoryInterface; public function __construct( - private RepositoryInterface $zoneRepository, + private ZoneRepositoryInterface $zoneRepository, )Sylius\Component\Core\Updater\UnpaidOrdersStateUpdateruse Doctrine\Persistence\ObjectManager; use SM\Factory\Factory; use Sylius\Abstraction\StateMachine\StateMachineInterface; public function __construct( OrderRepositoryInterface $orderRepository, - Factory $stateMachineFactory, + StateMachineInterface $stateMachineFactory, string $expirationPeriod, LoggerInterface $logger, + ObjectManager $orderManager, int $batchSize = 100, )Sylius\Component\Core\Calculator\ProductVariantPriceCalculatoruse Sylius\Component\Core\Checker\ProductVariantLowestPriceDisplayCheckerInterface; public function __construct( + ProductVariantLowestPriceDisplayCheckerInterface $productVariantLowestPriceDisplayChecker, )Sylius\Component\Core\OrderProcessing\OrderPaymentProcessoruse Sylius\Component\Core\Payment\Remover\OrderPaymentsRemoverInterface; /** @param array<string> $unprocessableOrderStates */ public function __construct( OrderPaymentProviderInterface $orderPaymentProvider, string $targetState = PaymentInterface::STATE_CART, + OrderPaymentsRemoverInterface $orderPaymentsRemover, + array $unprocessableOrderStates, )Sylius\Component\Core\Taxation\Applicator\OrderItemsTaxesApplicatoruse Sylius\Component\Core\Distributor\ProportionalIntegerDistributorInterface; public function __construct( CalculatorInterface $calculator, AdjustmentFactoryInterface $adjustmentFactory, IntegerDistributorInterface $distributor, TaxRateResolverInterface $taxRateResolver, + ProportionalIntegerDistributorInterface $proportionalIntegerDistributor, )Sylius\Component\Core\Taxation\Applicator\OrderItemUnitsTaxesApplicatoruse Sylius\Component\Core\Distributor\ProportionalIntegerDistributorInterface; public function __construct( CalculatorInterface $calculator, AdjustmentFactoryInterface $adjustmentFactory, TaxRateResolverInterface $taxRateResolver, + ProportionalIntegerDistributorInterface $proportionalIntegerDistributor, )Sylius\Component\Core\Taxation\Applicator\OrderItemUnitsTaxesApplicatoruse Sylius\Component\Promotion\Checker\Rule\RuleCheckerInterface; public function __construct( - RuleCheckerInterface $itemTotalRuleChecker, )
-
Since catalog promotion action and scope validations have been rewritten to be more inline with symfony, the previous abstraction has been deprecated. This includes:
Sylius\Bundle\PromotionBundle\Validator\CatalogPromotionAction\ActionValidatorInterfaceSylius\Bundle\PromotionBundle\Validator\CatalogPromotionScope\ScopeValidatorInterfaceSylius\Bundle\PromotionBundle\Validator\CatalogPromotionActionValidatorSylius\Bundle\PromotionBundle\Validator\CatalogPromotionScopeValidator
-
The way of getting variants prices based on options has been changed, as such the following services were deprecated, please use their new counterpart.
- instead of
Sylius\Component\Core\Provider\ProductVariantsPricesProviderInterfaceuseSylius\Component\Core\Provider\ProductVariantMap\ProductVariantsMapProviderInterface - instead of
Sylius\Component\Core\Provider\ProductVariantsPricesProvideruseSylius\Component\Core\Provider\ProductVariantMap\ProductVariantsPricesMapProvider - instead of
Sylius\Bundle\CoreBundle\Templating\Helper\ProductVariantsPricesHelperuseSylius\Component\Core\Provider\ProductVariantMap\ProductVariantsPricesMapProvider - instead of
Sylius\Bundle\CoreBundle\Twig\ProductVariantsPricesExtensionuseSylius\Bundle\CoreBundle\Twig\ProductVariantsMapExtension
Subsequently, the
sylius_product_variant_pricestwig function is deprecated, usesylius_product_variants_mapinstead.To add more data per variant create a service implementing the
Sylius\Component\Core\Provider\ProductVariantMap\ProductVariantMapProviderInterfaceand tag it withsylius.product_variant_data_map_provider. - instead of
-
Interface
Sylius\Component\Promotion\Generator\PromotionCouponGeneratorInstructionInterfacehas been refactored and is now deprecated. It now extends a new interfaceSylius\Component\Promotion\Generator\PromotionCouponGeneratorInstructionReadInterface, which contains only getter methods.- If your services or custom implementations previously relied
on
Sylius\Component\Promotion\Generator\PromotionCouponGeneratorInstructionInterfacefor read operations, you should now useSylius\Component\Promotion\Generator\PromotionCouponGeneratorInstructionReadInterfacefor better clarity and separation of concerns. - This change is backward compatible as long as your implementations or services were using only the getter methods
from
Sylius\Component\Promotion\Generator\PromotionCouponGeneratorInstructionInterface. However, if you also utilized setter methods, you should continue usingSylius\Component\Promotion\Generator\PromotionCouponGeneratorInstructionInterface.
- If your services or custom implementations previously relied
on
-
All console commands have been moved from
CommandtoConsole\Command. TheCommandnamespace is considered deprecated for console commands and will only be used for CQRS-related commands starting with Sylius 2.0. List of affected classes:Sylius\Bundle\OrderBundle\Command\RemoveExpiredCartsCommandtoSylius\Bundle\OrderBundle\Console\Command\RemoveExpiredCartsCommandSylius\Bundle\PromotionBundle\Command\GenerateCouponsCommandtoSylius\Bundle\PromotionBundle\Console\Command\GenerateCouponsCommandSylius\Bundle\UiBundle\Command\DebugTemplateEventCommandtoSylius\Bundle\UiBundle\Console\Command\DebugTemplateEventCommandSylius\Bundle\UserBundle\Command\AbstractRoleCommandtoSylius\Bundle\UserBundle\Console\Command\AbstractRoleCommandSylius\Bundle\UserBundle\Command\DemoteUserCommandtoSylius\Bundle\UserBundle\Console\Command\DemoteUserCommandSylius\Bundle\UserBundle\Command\PromoteUserCommandtoSylius\Bundle\UserBundle\Console\Command\PromoteUserCommandSylius\Bundle\CoreBundle\Command\Model\PluginInfotoSylius\Bundle\CoreBundle\Console\Command\Model\PluginInfoSylius\Bundle\CoreBundle\Command\AbstractInstallCommandtoSylius\Bundle\CoreBundle\Console\Command\AbstractInstallCommandSylius\Bundle\CoreBundle\Command\CancelUnpaidOrdersCommandtoSylius\Bundle\CoreBundle\Console\Command\CancelUnpaidOrdersCommandSylius\Bundle\CoreBundle\Command\CheckRequirementsCommandtoSylius\Bundle\CoreBundle\Console\Command\CheckRequirementsCommandSylius\Bundle\CoreBundle\Command\InformAboutGUSCommandtoSylius\Bundle\CoreBundle\Console\Command\InformAboutGUSCommandSylius\Bundle\CoreBundle\Command\InstallAssetsCommandtoSylius\Bundle\CoreBundle\Console\Command\InstallAssetsCommandSylius\Bundle\CoreBundle\Command\InstallCommandtoSylius\Bundle\CoreBundle\Console\Command\InstallCommandSylius\Bundle\CoreBundle\Command\InstallDatabaseCommandtoSylius\Bundle\CoreBundle\Console\Command\InstallDatabaseCommandSylius\Bundle\CoreBundle\Command\InstallSampleDataCommandtoSylius\Bundle\CoreBundle\Console\Command\InstallSampleDataCommandSylius\Bundle\CoreBundle\Command\JwtConfigurationCommandtoSylius\Bundle\CoreBundle\Console\Command\JwtConfigurationCommandSylius\Bundle\CoreBundle\Command\SetupCommandtoSylius\Bundle\CoreBundle\Console\Command\SetupCommandSylius\Bundle\CoreBundle\Command\ShowAvailablePluginsCommandtoSylius\Bundle\CoreBundle\Console\Command\ShowAvailablePluginsCommand
-
Product variants resolving has been refactored for better extendability. The tag
sylius.product_variant_resolver.defaulthas been removed as it was never used. To register a custom variant resolver use the tagsylius.product_variant_resolverwith a fitting priority.All internal usages of service
sylius.product_variant_resolver.defaulthave been switched toSylius\Component\Product\Resolver\ProductVariantResolverInterface, if you have been using thesylius.product_variant_resolver.defaultservice apply this change accordingly. -
Sylius 2.0 will introduce a significant restructuring of our class system to enhance efficiency and clarity. The changes are as follows:
Messagewill be migrated toCommand.MessageDispatcherwill be migrated toCommandDispatcher.MessageHandlerwill be migrated toCommandHandler.- Example: Within the
Sylius\Bundle\CoreBundle, theMessageHandler\ResendOrderConfirmationEmailHandlerclass will be migrated toCommandHandler\ResendOrderConfirmationEmailHandler. This pattern will be mirrored across other bundles in the system.
-
Class
Sylius\Component\Core\Promotion\Updater\Rule\TotalOfItemsFromTaxonRuleUpdaterhas been deprecated, as it is no more used. -
Class
Sylius\Component\Core\Promotion\Updater\Rule\ContainsProductRuleUpdaterhas been deprecated, as it is no more used. -
Class
Sylius\Bundle\AdminBundle\EmailManager\OrderEmailManagerand its interfaceSylius\Bundle\AdminBundle\EmailManager\OrderEmailManagerInterfacehave been deprecated, useSylius\Bundle\CoreBundle\Mailer\OrderEmailManagerandSylius\Bundle\CoreBundle\Mailer\OrderEmailManagerInterfaceinstead. -
Class
Sylius\Bundle\AdminBundle\EmailManager\ShipmentEmailManagerand its interfaceSylius\Bundle\AdminBundle\EmailManager\ShipmentEmailManagerInterfacehave been deprecated, useSylius\Bundle\CoreBundle\Mailer\ShipmentEmailManagerandSylius\Bundle\CoreBundle\Mailer\ShipmentEmailManagerInterfaceinstead. -
Class
Sylius\Bundle\ShopBundle\EmailManager\ContactEmailManagerand its interfaceSylius\Bundle\ShopBundle\EmailManager\ContactEmailManagerInterfacehave been deprecated, useSylius\Bundle\CoreBundle\Mailer\ContactEmailManagerandSylius\Bundle\CoreBundle\Mailer\ContactEmailManagerInterfaceinstead. -
Class
Sylius\Bundle\ShopBundle\EmailManager\OrderEmailManagerand its interfaceSylius\Bundle\ShopBundle\EmailManager\OrderEmailManagerInterfacehave been deprecated, useSylius\Bundle\CoreBundle\Mailer\OrderEmailManagerandSylius\Bundle\CoreBundle\Mailer\OrderEmailManagerInterfaceinstead. -
Class
Sylius\Bundle\ProductBundle\Form\Type\ProductOptionChoiceTypehas been deprecated. UseSylius\Bundle\ProductBundle\Form\Type\ProductOptionAutocompleteTypeinstead. -
Interface
Sylius\Bundle\ShopBundle\Calculator\OrderItemsSubtotalCalculatorInterfaceand classSylius\Bundle\ShopBundle\Twig\OrderItemsSubtotalExtensionresponsible for thesylius_order_items_subtotaltwig function have been deprecated and will be removed in Sylius 2.0. Use the::getItemsSubtotal()method from theOrderclass instead. -
Interface
Sylius\Component\Core\Promotion\Updater\Rule\ProductAwareRuleUpdaterInterfacehas been deprecated and will be removed in Sylius 2.0. -
Both
getCreatedByGuestandsetCreatedByGuestmethods were deprecated onSylius\Component\Core\Model\OrderInterface. Please useisCreatedByGuestinstead of the first one. The latter is a part of thesetCustomerWithAuthorizationlogic and should be used only this way. -
The
Sylius\Bundle\ShippingBundle\Provider\CalendarandSylius\Bundle\ShippingBundle\Provider\DateTimeProviderhave been deprecated and will be removed in Sylius 2.0. UseSymfony\Component\Clock\Clockinstead. -
Class
Sylius\Component\Promotion\Checker\Rule\CartQuantityRuleCheckerhas been deprecated. UseSylius\Component\Core\Promotion\Checker\Rule\CartQuantityRuleCheckerinstead. -
Class
Sylius\Component\Promotion\Checker\Rule\ItemTotalRuleCheckerhas been deprecated. UseSylius\Component\Core\Promotion\Checker\Rule\ItemTotalRuleCheckerinstead. -
The
Sylius\Bundle\CoreBundle\CatalogPromotion\Command\RemoveInactiveCatalogPromotioncommand and its handlerSylius\Bundle\CoreBundle\CatalogPromotion\CommandHandler\RemoveInactiveCatalogPromotionHandlerhave been deprecated. UseSylius\Bundle\CoreBundle\CatalogPromotion\Command\RemoveCatalogPromotioncommand instead. -
Class
Sylius\Bundle\ShopBundle\Calculator\OrderItemsSubtotalCalculatorhas been deprecated. Order items subtotal calculation is now available on the Order modelSylius\Component\Core\Model\Order::getItemsSubtotal. -
The
redirectToCartSummaryprotected method ofSylius\Bundle\OrderBundle\Controller\OrderControllerhas been deprecated as it was never used and will be removed in Sylius 2.0. -
Due to optimizations of the Order's grid the
Sylius\Component\Core\Repository\OrderRepositoryInterface::createSearchListQueryBuildermethod bas been deprecated in both the interface and the class, and replaced bySylius\Component\Core\Repository\OrderRepositoryInterface::createCriteriaAwareSearchListQueryBuilder. AlsoSylius\Component\Core\Repository\OrderRepositoryInterface::createByCustomerIdQueryBuilderhas been deprecated in both the interface and the class, and replaced bySylius\Component\Core\Repository\OrderRepositoryInterface::createByCustomerIdCriteriaAwareQueryBuilderfor the same reason. Both changes affectsylius_admin_orderandsylius_admin_customer_ordergrids configuration. -
The
Sylius\Bundle\CoreBundle\Provider\SessionProviderhas been deprecated and will be removed in Sylius 2.0. -
The
Sylius\Component\Addressing\Repository\ZoneRepositoryInterfaceandSylius\Bundle\AddressingBundle\Repository\ZoneRepositorywere added. If you created a customZonerepository, you should update it to extend theSylius\Bundle\AddressingBundle\Repository\ZoneRepository -
The service definition for
sylius.promotion_rule_checker.item_totalhas been updated. The class has been changed fromSylius\Component\Promotion\Checker\Rule\ItemTotalRuleCheckertoSylius\Component\Core\Promotion\Checker\Rule\ItemTotalRuleChecker. -
The
sylius.http_message_factoryservice has been deprecated. UsePsr\Http\Message\RequestFactoryInterfaceinstead. -
The
sylius.http_clienthas become an alias topsr18.http_clientservice. -
The
sylius.payum.http_clienthas become a service ID of newly createdSylius\Bundle\PayumBundle\HttpClient\HttpClient. -
The argument of
Sylius\Bundle\CoreBundle\EventListener\PaymentPreCompleteListenerhas been changed fromSylius\Component\Inventory\Checker\AvailabilityCheckerInterfacetosylius.availability_checker. This is the alias to the same service. -
The interface
Sylius\Component\Core\SyliusLocaleEventshas been deprecated and will be removed in Sylius 2.0. -
The
Sylius\Bundle\CoreBundle\EventListener\CustomerReviewsDeleteListenerhas been removed as it was not used.
-
To ease customization we've introduced attributes for some services in
1.13:Sylius\Bundle\OrderBundle\Attribute\AsCartContextfor cart contextsSylius\Bundle\OrderBundle\Attribute\AsOrderProcessorfor order processorsSylius\Bundle\ProductBundle\Attribute\AsProductVariantResolverfor product variant resolvers
By default, Sylius still configures them using interfaces, but this way you cannot define a priority. If you want to define a priority, you need to set the following configuration in your
_sylius.yamlfile:sylius_core: autoconfigure_with_attributes: true
and use one of the new attributes accordingly to the type of your class, e.g.:
<?php declare(strict_types=1); namespace App\OrderProcessor; use Sylius\Bundle\OrderBundle\Attribute\AsOrderProcessor; use Sylius\Component\Order\Model\OrderInterface; use Sylius\Component\Order\Processor\OrderProcessorInterface; #[AsOrderProcessor(/*priority: 10*/)] //priority is optional final class OrderProcessorWithAttributeStub implements OrderProcessorInterface { public function process(OrderInterface $order): void { } }
-
A new parameter has been added to specify the validation groups for a given promotion action. If you have any custom validation groups for your promotion action, you need to add them to your
config/packages/_sylius.yamlfile. Additionally, if you have your own promotion action and want to add your validation groups, you can add another key to thepromotion_action.validation_groupsparameter. This is handled bySylius\Bundle\PromotionBundle\Validator\PromotionActionGroupValidatorand it resolves the groups based on the type of the passed promotion action.sylius_promotion: promotion_action: validation_groups: order_percentage_discount: - 'sylius' - 'sylius_promotion_action_order_percentage_discount' shipping_percentage_discount: - 'sylius' - 'sylius_promotion_action_shipping_percentage_discount' your_promotion_action: - 'sylius' - 'your_custom_validation_group'
Along with this update, constraints have been removed from specific action form types. The affected form types include:
Sylius\Bundle\PromotionBundle\Form\Type\Action\FixedDiscountConfigurationTypeSylius\Bundle\PromotionBundle\Form\Type\Action\PercentageDiscountConfigurationTypeSylius\Bundle\PromotionBundle\Form\Type\Action\UnitFixedDiscountConfigurationTypeSylius\Bundle\PromotionBundle\Form\Type\Action\UnitPercentageDiscountConfigurationType
The constraints previously defined in these forms are now in
src/Sylius/Bundle/CoreBundle/Resources/config/validation/PromotionAction.xmland managed via the new validation groups parameters in the configuration. -
Sylius Mailer email configuration keys in the
src/Sylius/Bundle/CoreBundle/Resources/config/app/sylius/sylius_mailer.ymlfile have been changed:Deprecated:
sylius_mailer: emails: account_verification_token: subject: sylius.emails.user.verification_token.subject
New:
sylius_mailer: emails: account_verification: subject: sylius.email.user.account_verification.subject
-
A new parameter has been added to specify the validation groups for a given catalog promotion action. If you have any custom validation groups for your catalog promotion action, you need to add them to your
config/packages/_sylius.yamlfile. Additionally, if you have your own catalog promotion action and want to add your validation groups, you can add another key to thecatalog_promotion_action.validation_groupsparameter. This is handled bySylius\Bundle\PromotionBundle\Validator\CatalogPromotionActionGroupValidatorand it resolves the groups based on the type of the passed catalog promotion action.sylius_promotion: catalog_promotion_action: validation_groups: percentage_discount: - 'sylius' - 'sylius_catalog_promotion_action_percentage_discount' fixed_discount: - 'sylius' - 'sylius_catalog_promotion_action_fixed_discount' your_action: - 'sylius' - 'your_custom_validation_group'
Along with this update, constraints have been removed from specific rule form types. The affected form types include:
Sylius\Bundle\PromotionBundle\Form\Type\CatalogPromotionAction\FixedDiscountActionConfigurationTypeSylius\Bundle\PromotionBundle\Form\Type\CatalogPromotionAction\PercentageDiscountActionConfigurationType
The constraints previously defined in these forms are now in
src/Sylius/Bundle/PromotionBundle/Resources/config/validation/CatalogPromotionAction.xmlandsrc/Sylius/Bundle/CoreBundle/Resources/config/validation/CatalogPromotionAction.xmland are managed via the new validation groups parameters in the configuration. -
A new parameter has been added to specify the validation groups for a given catalog promotion scope. If you have any custom validation groups for your catalog promotion scope, you need to add them to your
config/packages/_sylius.yamlfile. Additionally, if you have your own catalog promotion scope and want to add your validation groups, you can add another key to thecatalog_promotion_scope.validation_groupsparameter. This is handled bySylius\Bundle\PromotionBundle\Validator\CatalogPromotionScopeGroupValidatorand it resolves the groups based on the type of the passed catalog promotion scope.sylius_promotion: catalog_promotion_scope: validation_groups: for_products: - 'sylius' - 'sylius_catalog_promotion_scope_for_products' for_taxons: - 'sylius' - 'sylius_catalog_promotion_scope_for_taxons' your_scope: - 'sylius' - 'your_custom_validation_group'
Along with this update, constraints have been removed from specific rule form types. The affected form types include:
Sylius\Bundle\CoreBundle\Form\Type\CatalogPromotionScope\ForProductsScopeConfigurationTypeSylius\Bundle\CoreBundle\Form\Type\CatalogPromotionScope\ForTaxonsScopeConfigurationTypeSylius\Bundle\CoreBundle\Form\Type\CatalogPromotionScope\ForVariantsScopeConfigurationType
The constraints previously defined in these forms are now in
src/Sylius/Bundle/CoreBundle/Resources/config/validation/CatalogPromotionScope.xmland managed via the new validation groups parameters in the configuration. -
A new parameter has been added to specify the validation groups for a given promotion rule. If you have any custom validation groups for your promotion rule, you need to add them to your
config/packages/_sylius.yamlfile. Additionally, if you have your own promotion rule and want to add your validation groups, you can add another key to thepromotion_rule.validation_groupsparameter. This is handled bySylius\Bundle\PromotionBundle\Validator\PromotionRuleGroupValidatorand it resolves the groups based on the type of the passed promotion rule.sylius_promotion: promotion_rule: validation_groups: cart_quantity: - 'sylius' - 'sylius_promotion_rule_cart_quantity' customer_group: - 'sylius' - 'sylius_promotion_rule_customer_group' your_promotion_rule: - 'sylius' - 'your_custom_validation_group'
Along with this update, constraints have been removed from specific rule form types. The affected form types include:
Sylius\Bundle\CoreBundle\Form\Type\Promotion\Rule\ContainsProductConfigurationTypeSylius\Bundle\CoreBundle\Form\Type\Promotion\Rule\NthOrderConfigurationTypeSylius\Bundle\PromotionBundle\Form\Type\Rule\CartQuantityConfigurationTypeSylius\Bundle\PromotionBundle\Form\Type\Rule\ItemTotalConfigurationType
The constraints previously defined in these forms are now in
src/Sylius/Bundle/CoreBundle/Resources/config/validation/PromotionRule.xmland managed via the new validation groups parameters in the configuration. -
A new parameter has been added to specify the validation groups for given gateway factory. If you have any custom validation groups for your factory, you need to add them to your
config/packages/_sylius.yamlfile. Also, if you have your own gateway factory and want to add your validation groups you can add another entry to thevalidation_groupsconfiguration node. It is handled bySylius\Bundle\PayumBundle\Validator\GroupsGenerator\GatewayConfigGroupsGeneratorand it resolves the groups based on the passed factory name:sylius_payum: gateway_config: validation_groups: paypal_express_checkout: - 'sylius' - 'sylius_paypal_express_checkout' stripe_checkout: - 'sylius' - 'sylius_stripe_checkout' your_gateway: - 'sylius' - 'your_custom_validation_group'
-
New parameters have been added to specify the validation groups for a given shipping method rule and calculator. If you have any custom validation groups for your calculators or rules, you need to add them to your
config/packages/_sylius.yamlfile. Also, if you have your own shipping method rule or calculator and want to add your validation groups you can add another key to thevalidation_groupsparameter:sylius_shipping: shipping_method_rule: validation_groups: total_weight_greater_than_or_equal: - 'sylius' - 'sylius_shipping_method_rule_total_weight' order_total_greater_than_or_equal: - 'sylius' - 'sylius_shipping_method_rule_order_total' your_shipping_method_rule: - 'sylius' - 'your_custom_validation_group' shipping_method_calculator: validation_groups: flat_rate: - 'sylius' - 'sylius_shipping_method_calculator_rate' per_unit_rate: - 'sylius' - 'sylius_shipping_method_calculator_rate' your_shipping_method_calculator: - 'sylius' - 'your_custom_validation_group'
-
The new parameter has been added to specify the max integer value that could be used, by default the value is
2147483647if you want to change it you need to add the following configuration to yourconfig/packages/_sylius.yamlfile:sylius_core: max_int_value: 9223372036854775807
-
The
sylius_inventory.checkerconfiguration node has been deprecated and will be removed in 2.0. -
Due to changes in API paths, the
securityconfiguration has been changed:security: ... firewalls: new_api_admin_user: json_login: - check_path: "%sylius.security.new_api_admin_route%/authentication-token" + check_path: "%sylius.security.new_api_admin_route%/administrators/token" ... new_api_shop_user: json_login: - check_path: "%sylius.security.new_api_shop_route%/authentication-token" + check_path: "%sylius.security.new_api_shop_route%/customers/token" ... access_control: ... - - { path: "%sylius.security.new_api_admin_route%/reset-password-requests", role: PUBLIC_ACCESS } + - { path: "%sylius.security.new_api_admin_route%/administrators/reset-password", role: PUBLIC_ACCESS } - - { path: "%sylius.security.new_api_admin_route%/authentication-token", role: PUBLIC_ACCESS } + - { path: "%sylius.security.new_api_admin_route%/administrators/token", role: PUBLIC_ACCESS } - - { path: "%sylius.security.new_api_shop_route%/authentication-token", role: PUBLIC_ACCESS } + - { path: "%sylius.security.new_api_shop_route%/customers/token", role: PUBLIC_ACCESS }
-
A new firewall has been added to the
securityconfiguration:security: ... firewalls: ... image_resolver: pattern: ^/media/cache/resolve security: false ... ...
-
All instances of
optionsnode have been deprecated in all resource and translation configurations.
-
We have configured all existing Sylius graphs to be usable with the Symfony Workflow out of the box. Winzou State Machine is still the default state machine for all graphs, but you can switch to Symfony Workflow via configuration:
sylius_state_machine_abstraction: graphs_to_adapters_mapping: <graph_name>: <adapter_name> # e.g. sylius_order_checkout: symfony_workflow # available adapters: symfony_workflow, winzou_state_machine # we can also can the default adapter default_adapter: symfony_workflow # winzou_state_machine is a default value here
Starting with
Sylius 2.0Symfony Workflow will be the default state machine for all graphs. -
In the
sylius_paymentstate machine ofPaymentBundle, there has been a change in the state name:- State name change:
- From:
void - To:
unknown
- From:
- State name change:
-
In the
sylius_paymentstate machine ofPaymentBundle, a new stateauthorizedhas been introduced, along with a new transition:- Transition
authorize:- From states: [
new,processing] - To state:
authorized
- From states: [
Due to that the following transitions have been updated:
- Transition
complete:- From states: [
new,processing,authorized] - To state:
completed
- From states: [
- Transition
fail:- From states: [
new,processing,authorized] - To state:
failed
- From states: [
- Transition
cancel:- From states: [
new,processing,authorized] - To state:
cancelled
- From states: [
- Transition
void:- From states: [
new,processing,authorized] - To state:
unknown
- From states: [
- Transition
-
The
sylius_paymentstate machine ofCoreBundlehas been updated to allow failing an authorized payment:- Transition
fail:- From states: [
new,processing,authorized] - To state:
failed
- From states: [
- Transition
-
Validation translation key
sylius.review.rating.rangehas been replaced bysylius.review.rating.not_in_rangein all places used by Sylius. Thesylius.review.rating.rangehas been left for backward compatibility and will be removed in Sylius 2.0. -
Translation keys in the
Sylius\Bundle\CoreBundle\Resources\translations\messages.en.ymlunder thesylius.emailkey have been changed:Deprecated:
sylius: email: verification_token: hello: 'Hello' message: 'Verify your account with token: ' subject: 'Email address verification' to_verify_your_email_address: 'To verify your email address - click the link below' verify_your_email_address: 'Verify your email address'
New:
sylius: email: user: account_verification: greeting: 'Hello' message: 'Verify your account with token: ' statement: 'Verify your email address' strategy: 'To verify your email address - click the link below' subject: 'Email address verification'
-
Using Guzzle 6 has been deprecated in favor of Symfony HTTP Client. If you want to still use Guzzle 6 or Guzzle 7, you need to install
composer require php-http/guzzle6-adapterorcomposer require php-http/guzzle7-adapterdepending on your Guzzle version. Subsequently, you need to register the adapter as aPsr\Http\Client\ClientInterfaceservice as the following:services: Psr\Http\Client\ClientInterface: class: Http\Adapter\Guzzle7\Client # for Guzzle 6 use Http\Adapter\Guzzle6\Client instead
-
PostgreSQL migration support has been introduced. If you are using PostgreSQL, we assume that you have already created a database schema in some way. All you need to do is run migrations, which will mark all migrations created before Sylius 1.13 as executed.
-
We have explicitly added relationships between product and reviews and between product and attributes in XML mappings. Because of that, the subscribers
Sylius\Bundle\AttributeBundle\Doctrine\ORM\Subscriber\LoadMetadataSubscriberandSylius\Bundle\ReviewBundle\Doctrine\ORM\Subscriber\LoadMetadataSubscriberhave been modified so they do not add a relationship if one already exists. If you have overwritten or decorated it, there may be a need to update it. -
The behavior of the
sylius:install:setupcommand has changed, becauseSylius\Bundle\CoreBundle\Installer\Setup\LocaleSetuphas been updated. Now, it automatically replaces the existinglocaleparameter in the configuration with the one provided for the store. -
Extracted the section responsible for the
ShopBundlefrom@SyliusCore/Email/accountVerification.html.twigand relocated it to@SyliusShop/Email/verification.html.twig. -
Using
parentIdquery parameter to generate slug inSylius\Bundle\TaxonomyBundle\Controller\TaxonSlugControllerhas been deprecated. Use theparentCodequery parameter instead. -
The
RegexandLengthconstraints have been removed fromSylius\Component\Addressing\Model\Countryin favour of theCountryconstraint. Due to that, their translation messagessylius.country.code.regexandsylius.country.code.exact_lengthwere also removed. -
The
RegexandLengthconstraints have been removed fromSylius\Component\Currency\Model\Currencyin favour of theCurrencyconstraint. Due to that, their translation messagessylius.currency.regexandsylius.currency.exact_lengthwere also removed. -
The
Regexconstraint has been removed fromSylius\Component\Locale\Model\Localein favour of theLocaleconstraint. Due to that, the translation messagesylius.locale.code.regexwas also removed. -
The
sylius_admin_ajax_taxon_moveroute has been deprecated. If you're relaying on it, consider migrating to newsylius_admin_ajax_taxon_move_upandsylius_admin_ajax_taxon_move_downroutes. -
Check if the
countryCodeis set has been removed from theSylius\Component\Addressing\ModelAddress::setProvinceCodemethod. The adequate check is ensured by validation. -
The migration changing the type of the
DC2TYPE:arraytoJSONhas been added to the following fields in tables:data=>sylius_address_log_entriesroles=>sylius_admin_userconfiguration=>sylius_catalog_promotion_actionconfiguration=>sylius_catalog_promotion_scopeconfiguration=>sylius_product_attributeconfiguration=>sylius_promotion_actionconfiguration=>sylius_promotion_ruleconfiguration=>sylius_shipping_methodconfiguration=>sylius_shipping_method_ruleroles=>sylius_shop_user
If you prefer skipping this migration and applying the changes yourself you can do it by executing the following commands:
For MySQL migration:
bin/console doctrine:migrations:version --add Sylius\\Bundle\\CoreBundle\\Migrations\\Version20240315112656
For PostgresSQL migration:
bin/console doctrine:migrations:version --add Sylius\\Bundle\\CoreBundle\\Migrations\\Version20240318094743
Along with this change, the
datafield in thesylius_address_log_entriestable is now nullable within our database schema, aligning with the nullable nature of the corresponding field in Gedmo's LogEntry.