UPGRADE ======= ## From 0.17 to 0.18.x ### Translation and TranslationBundle * Merged ``Translation`` component with ``Resource`` component * Merged ``TranslationBundle`` with ``ResourceBundle`` * Renamed ``TranslatableResourceRepository`` to ``TranslatableRepository`` ### Core and CoreBundle * Removed "exclude" option from ``taxon`` rule ## From 0.16 to 0.17.x ### Promotion and PromotionBundle * Changed "item_count" promotion type into "cart_quantity". It now checks cart quantity instead different items number. ### Resource and SyliusResourceBundle * All resources must implement ``Sylius\Component\Resource\Model\ResourceInterface``; * ResourceController has been rewritten from scratch but should maintain 100% of previous functionality; * ``$this->config`` is no longer available and you should create it manually in every action; Before: ```php render($this->config->getTemplate('custom.html')); } } ``` After: ```php requestConfigurationFactory->create($this->metadata, $request); return $this->render($configuration->getTemplate('custom.html')); } } ``` * Custom view handler has been introduced and ResourceController no longer extends FOSRestController: Before: ```php handleView($this->view(null, 204)); } } ``` After: ```php requestConfigurationFactory->create($this->metadata, $request); return $this->viewHandler->handle($configuration, View::create(null, 204)); } } ``` * DomainManager has been replaced with standard manager and also repository is injected into the controller; Before: ```php domainManager->create($book); $this->domainManager->update($book); $this->domainManager->delete($book); } } ``` After: ```php repository->add($book); $this->manager->flush(); $this->repository->remove($book); } } ``` * ``getForm()`` has been removed in favor of properly injected service; Before: ```php getForm($book); } } ``` After: ```php requestConfigurationFactory->create($this->metadata, $request); // ... $form = $this->resourceFormFactory->create($configuration, $book); } } ``` * Events are no longer dispatched by the removed "DomainManager". Before: ```php domainManager->create($book); } } ``` After: ```php requestConfigurationFactory->create($this->metadata, $request); $event = $this->eventDispatcher->dispatchPreEvent(ResourceActions::CREATE, $configuration, $book); $this->repository->add($book); $event = $this->eventDispatcher->dispatchPostEvent(ResourceActions::CREATE, $configuration, $book); } } ``` ### Core and CoreBundle * Moved ``taxCategory`` from ``Product`` to ``ProductVariant``; * ``OrderItem`` model from Core component no longer implements ``PromotionSubjectInterface``. Remove all usages of ``addPromotion``, etc. from your custom code. Custom actions targeting items need to be adjusted - see ``ContainsProductRuleChecker`` for reference. ### Addressing and SyliusAddressingBundle * Extracted ``Country`` ISO code to name translation, from model to a twig extension: ``CountryNameExtension``; * Removed ``Address`` relations to ``Country`` and ``Province`` objects, their unique ``code`` is used instead; * Removed specific ``ZoneMembers`` i.e. ``ProvinceZoneMember`` in favor of a dynamic ``ZoneMember``; * https://github.com/Sylius/Sylius/pull/3696 * ``exchangeRate`` is now recorded for ``Order`` at time of purchase for accurate cross-currency reporting. ### Order and SyliusOrderBundle * Introduced ``OrderItemUnit``, which represents every single unit in ``Order``; * Replaced ``InventoryUnit`` with ``OrderItemUnit`` in the core. This entity will be used as ``InventoryUnit`` and ``ShipmentItem``; * Removed ``setQuantity()`` method from ``OrderItem``; * Introduced ``OrderItemUnitFactory`` creating unit for specific ``OrderItem`` by ``createForItem()`` method; * Introduced ``OrderItemQuantityModifier`` that is used to control ``OrderItem`` quantity and units; * Introduced ``OrderItemQuantityDataMapper``, which attached to ``OrderItemType`` uses proper service to modify ``OrderItem`` quantity; * Changed ``Adjustment`` ``description`` field to ``label``; ### Shipping and ShippingBundle * Renamed ``ShipmentItem`` to ``ShipmentUnit`` to align with full-stack ``OrderItemUnit`` that it represents and avoid confusion against the similarly named ``OrderItem``. * Also renamed all associated 'item' wording to 'unit' in forms and form configuration (e.g. ``DefaultCalculators::PER_UNIT_RATE`` and ``RuleInterface::TYPE_UNIT_TOTAL``). * Shipping resources config must be updated: Before: ```yml sylius_shipping: resources: shipment_item: classes: model: %sylius.model.order_item_unit.class% ``` After: ```yml sylius_shipping: resources: shipment_unit: classes: model: %sylius.model.order_item_unit.class% ``` ### Currency ``CurrencyConverterInterface`` ``convert()`` method renamed to ``convertFromBase()``. ### Content ```bash #!/bin/sh set -ex app/console doctrine:phpcr:document:migrate-class "Symfony\Cmf\Bundle\ContentBundle\Doctrine\Phpcr\StaticContent" "Sylius\Bundle\ContentBundle\Document\StaticContent" app/console doctrine:phpcr:document:migrate-class "Symfony\Cmf\Bundle\RoutingBundle\Doctrine\Phpcr\Route" "Sylius\Bundle\ContentBundle\Document\Route" app/console doctrine:phpcr:document:migrate-class "Symfony\Cmf\Bundle\RoutingBundle\Doctrine\Phpcr\RedirectRoute" "Sylius\Bundle\ContentBundle\Document\RedirectRoute" app/console doctrine:phpcr:document:migrate-class "Symfony\Cmf\Bundle\MenuBundle\Doctrine\Phpcr\Menu" "Sylius\Bundle\ContentBundle\Document\Menu" app/console doctrine:phpcr:document:migrate-class "Symfony\Cmf\Bundle\MenuBundle\Doctrine\Phpcr\MenuNode" "Sylius\Bundle\ContentBundle\Document\MenuNode" app/console doctrine:phpcr:document:migrate-class "Symfony\Cmf\Bundle\BlockBundle\Doctrine\Phpcr\SlideshowBlock" "Sylius\Bundle\ContentBundle\Document\SlideshowBlock" app/console doctrine:phpcr:document:migrate-class "Symfony\Cmf\Bundle\BlockBundle\Doctrine\Phpcr\ImagineBlock" "Sylius\Bundle\ContentBundle\Document\ImagineBlock" app/console doctrine:phpcr:document:migrate-class "Symfony\Cmf\Bundle\BlockBundle\Doctrine\Phpcr\ActionBlock" "Sylius\Bundle\ContentBundle\Document\ActionBlock" app/console doctrine:phpcr:document:migrate-class "Symfony\Cmf\Bundle\BlockBundle\Doctrine\Phpcr\MenuBlock" "Sylius\Bundle\ContentBundle\Document\MenuBlock" app/console doctrine:phpcr:document:migrate-class "Symfony\Cmf\Bundle\BlockBundle\Doctrine\Phpcr\ReferenceBlock" "Sylius\Bundle\ContentBundle\Document\ReferenceBlock" app/console doctrine:phpcr:document:migrate-class "Symfony\Cmf\Bundle\BlockBundle\Doctrine\Phpcr\SimpleBlock" "Sylius\Bundle\ContentBundle\Document\SimpleBlock" app/console doctrine:phpcr:document:migrate-class "Symfony\Cmf\Bundle\BlockBundle\Doctrine\Phpcr\StringBlock" "Sylius\Bundle\ContentBundle\Document\StringBlock" ``` ## From 0.15.0 to 0.16.x ### General * Configuration structure for all bundles has changed: Before: ```yml sylius_taxation: validation_groups: tax_category: [sylius, custom] classes: tax_category: model: AppBundle\Entity\TaxCategory form: AppBundle\Form\Type\TaxCategoryType ``` After: ```yml sylius_taxation: resources: tax_category: classes: model: AppBundle\Entity\TaxCategory form: default: AppBundle\Form\Type\TaxCategoryType validation_groups: default: [sylius, custom] ``` * Validation groups parameters have been renamed: Before: ``` %sylius.validation_group.product% ``` After: ``` %sylius.validation_group**s**.product% ``` ### Attribute and SyliusAttributeBundle * Attribute system has been reworked and now every ``type`` is represented by ``AttributeTypeInterface`` instance; * https://github.com/Sylius/Sylius/pull/3608. ### SyliusPayumBundle * Changed configuration key `sylius_payum.classes.payment_config` to `sylius_payum.classes.gateway_config`; * ``PaymentConfig`` renamed to ``GatewayConfig``; ### Resource & SyliusResourceBundle * ``RepositoryInterface`` now has two additional methods `add` and `remove`; * Added ``InMemoryRepository`` which stores resources in memory; * Added ``DriverInterface`` which replaced previously used abstractions; * Reworked ``AbstractResourceExtension`` to be much simpler. ## From 0.14.0 to 0.15.x ### General * We no longer use FOSUserBundle; * User provider has been changed https://github.com/Sylius/Sylius/pull/2717/files#diff-da1af97fca8a5fcb6fb7053584105ba7R6; * Everything related to e-commerce (orders, addresses, groups and coupons) are now associated with Customer; * Everything related to system account remains on User entity; * Email no longer exist on Order; * All order are associated with Customer (even guest orders - during guest checkout Customer is created based on email); * User must have associated Customer; * Email no longer exist on User. It is on Customer now; * In the checkout we depend on Customer not User; * In templates in many places we use Customer instead of User entity now. ### Channel & SyliusChannelBundle https://github.com/Sylius/Sylius/pull/2752 ### User & SyliusUserBundle https://github.com/Sylius/Sylius/pull/2717 ### Database * Call ``` sylius:rbac:initialize ``` to create new roles in your system; * Execute migration script to migrate your data into the new model schema. **The migration script migrates only default data, if you have some customizations on any of affected entities you should take care of them yourself!** ### API Client https://github.com/Sylius/Sylius/pull/2887 ### SyliusApiBundle When you create server client in Sylius, it's public id was a combination of Client internal id and it's random id. For example: ``` client_id: 1_mpO5ZJ35hx ``` now it is simply random id, so it will be changed to: ``` client_id: mpO5ZJ35hx ``` **Remember to update your API clients using Sylius!** Related discussion https://github.com/FriendsOfSymfony/FOSOAuthServerBundle/issues/328. ### Addressing * Removed `CountryTranslation`, using `Intl` Symfony component instead to provide translated country names based on ISO country code. https://github.com/Sylius/Sylius/pull/3035 ## From 0.9.0 to 0.10.x Version 0.10.x includes the new Sylius e-commerce components. All classes without Symfony dependency have been moved to separate ``Sylius\Component`` namespace. VariableProductBundle has been merged into ProductBundle. Its functionality extracted into two separate bundles - SyliusAttributeBundle & SyliusVariationBundle. Property model has been renamed to Attribute. Before performing this procedure, please create a safe backup of your database. This upgrade changes significantly the way product attributes and options are stored in the database. We do provide a way to migrate your data, but no rollback will be possible in case of a problem. In addition to the components split, we have switched to state-machine in order to deal with states, instead of hard-coded states. You can now configure all the states you want and the transitions between them. Please refer to `state-machine.yml` that you can find in the bundles using it. *Most events have been replaced by state-machine events, much more powerful. Please update your listeners to make them callbacks of state-machine transitions. Again, please refer to the state-machine configuration files to do so.* The signature of `PaymentInterface::setDetails` method was changed. Now it allows either array or instance of \Traversable. ### Addressing Model classes and ZoneMatcher services have been moved to ``Sylius\Component\Addressing`` namespace. ```bash $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\AddressingBundle\\Model/Sylius\\Component\\Addressing\\Model/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\AddressingBundle\\ZoneMatcher/Sylius\\Component\\Addressing\\ZoneMatcher/g' {} \; ``` ### Cart Model classes and several services have been moved to ``Sylius\Component\Cart`` namespace. ```bash $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\CartBundle\\Model/Sylius\\Component\\Cart\\Model/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\CartBundle\\Provider\\CartProviderInterface/Sylius\\Component\\Cart\\Provider\\CartProviderInterface/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\CartBundle\\Storage\\CartStorageInterface/Sylius\\Component\\Cart\\Storage\\CartStorageInterface/g' {} \; ``` Twig extension class name & service were changed: * `SyliusCartExtension` into `CartExtension`, * `sylius.cart_twig` into `sylius.twig.extension.cart` ### Core All Symfony independent code has been moved to ``Sylius\Component\Core`` namespace. Variant model has been renamed to ProductVariant and VariantImage to ProductVariantImage. ```bash $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\CoreBundle\\Model\\Variant/Sylius\\Component\\Core\\Model\\ProductVariant/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\CoreBundle\\Model/Sylius\\Component\\Core\\Model/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\CoreBundle\\Calculator/Sylius\\Component\\Core\\Calculator/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\CoreBundle\\OrderProcessing/Sylius\\Component\\Core\\OrderProcessing/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\CoreBundle\\Promotion/Sylius\\Component\\Core\\Promotion/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\CoreBundle\\Uploader/Sylius\\Component\\Core\\Uploader/g' {} \; ``` Twig extension class name & service were changed: * `SyliusMoneyExtension` into `SyliusMoneyExtension`, * `SyliusRestrictedZoneExtension` into `RestrictedZoneExtension`, * `sylius.twig.restricted_zone_extension` into `sylius.twig.extension.restricted_zone` ### Inventory Model classes and all Symfony-agnostic services have been moved to ``Sylius\Component\Inventory`` namespace. ```bash $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\InventoryBundle\\Model/Sylius\\Component\\Inventory\\Model/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\InventoryBundle\\Checker/Sylius\\Component\\Inventory\\Checker/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\InventoryBundle\\Factory/Sylius\\Component\\Inventory\\Factory/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\InventoryBundle\\Operator/Sylius\\Component\\Inventory\\Operator/g' {} \; ``` Twig extension class name & service were changed: * `SyliusInventoryExtension` into `InventoryExtension`, * `sylius.inventory_twig` into `sylius.twig.extension.inventory` ### Money Model classes and interfaces have been moved to ``Sylius\Component\Money`` namespace. ```bash $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\MoneyBundle\\Model/Sylius\\Component\\Money\\Model/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\MoneyBundle\\Converter/Sylius\\Component\\Money\\Converter/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\MoneyBundle\\Context\\CurrencyContextInterface/Sylius\\Component\\Money\\Context\\CurrencyContextInterface/g' {} \; ``` Twig extension class name & service were changed: * `SyliusMoneyExtension` into `MoneyExtension`, * `sylius.twig.money` into `sylius.twig.extension.money` ### Order Model classes and repository interfaces have been moved to ``Sylius\Component\Order`` namespace. ```bash $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\OrderBundle\\Model/Sylius\\Component\\Order\\Model/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\OrderBundle\\Generator/Sylius\\Component\\Order\\Generator/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\OrderBundle\\Repository/Sylius\\Component\\Order\\Repository/g' {} \; ``` ### Payment PaymentsBundle has been renamed to PaymentBundle. Model classes interfaces have been moved to ``Sylius\Component\Order`` namespace. ```bash $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\PaymentsBundle\\Model/Sylius\\Component\\Payment\\Model/g' {} \; $ find ./src -type f -exec sed -i 's/PaymentsBundle/PaymentBundle/g' {} \; ``` Configuration root node has been adjusted as well. Before: ```yaml sylius_payments: driver: doctrine/orm ``` After: ```yaml sylius_payment: driver: doctrine/orm ``` ### Product Previously, ProductBundle provided basic product model with properties support. VariableProductBundle, with its options and variants support, has been merged into the basic bundle. From now on, Sylius product catalog ships with variations support by default. The concept of properties has been renamed to attributes. * Property model becomes Attribute. * ProductProperty becomes AttributeValue. Attributes can be attached to any object and can be configured under ``sylius_attribute`` node. The product bundle configures its attributes automatically. ```bash $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\VariableProductBundle\\Model/Sylius\\Component\\Product\\Model/g' {} \; $ find ./src -type f -exec sed -i 's/sylius.repository.option/sylius.repository.product_option/g' {} \; $ find ./src -type f -exec sed -i 's/sylius.repository.option_value/sylius.repository.product_option_value/g' {} \; $ find ./src -type f -exec sed -i 's/sylius.repository.product_property/sylius.repository.product_attribute_value/g' {} \; $ find ./src -type f -exec sed -i 's/sylius.repository.property/sylius.repository.product_attribute/g' {} \; $ find ./src -type f -exec sed -i 's/sylius.repository.prototype/sylius.repository.product_prototype/g' {} \; $ find ./src -type f -exec sed -i 's/sylius.repository.variant/sylius.repository.product_variant/g' {} \; ``` Beware, the Doctrine relationship name has changed as well between `Variant` (now, `ProductVariant`) and `Product`. If you use it in custom repository methods, you need to adapt accordingly: Before: ```yaml variant.product ``` After: ```yaml product_variant.object ``` ### Promotion PromotionsBundle has been renamed to PromotionBundle. Model classes interfaces have been moved to ``Sylius\Component\Promotion`` namespace. ```bash $ find ./src -type f -exec sed -i 's/PromotionsBundle/PromotionBundle/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\PromotionBundle\\Model/Sylius\\Component\\Promotion\\Model/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\PromotionBundle\\Action/Sylius\\Component\\Promotion\\Action/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\PromotionBundle\\Checker/Sylius\\Component\\Promotion\\Checker/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\PromotionBundle\\Generator/Sylius\\Component\\Promotion\\Generator/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\PromotionBundle\\Processor/Sylius\\Component\\Promotion\\Processor/g' {} \; ``` Configuration root node has been adjusted as well. Before: ```yaml sylius_promotions: driver: doctrine/orm ``` After: ```yaml sylius_promotion: driver: doctrine/orm ``` ### Resource ResourceBundle model interfaces have been moved to ``Sylius\Component\Resource`` namespace. ``RepositoryInterface`` has been moved to ``Repository`` namespace under the component. ```bash $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\ResourceBundle\\Model/Sylius\\Component\\Resource\\Model/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Component\\Resource\\Model\\RepositoryInterface/Sylius\\Component\\Resource\\Repository\\RepositoryInterface/g' {} \; ``` Twig extension class name & service were changed: * `SyliusResourceExtension` into `SyliusResourceExtension`, * `sylius.twig.resource` into `sylius.twig.extension.resource` ### Settings Twig extension class name & service were changed: * `SyliusSettingsExtension` into `SettingsExtension`, * `sylius.settings.twig` into `sylius.twig.extension.settings` ### Shipping Model classes and Symfony agnostic services & interfaces have been moved to ``Sylius\Component\Shipping`` namespace. ```bash $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\ShippingBundle\\Model/Sylius\\Component\\Shipping\\Model/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\ShippingBundle\\Calculator/Sylius\\Component\\Shipping\\Calculator/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\ShippingBundle\\Checker/Sylius\\Component\\Shipping\\Checker/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\ShippingBundle\\Resolver/Sylius\\Component\\Shipping\\Resolver/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\ShippingBundle\\Processor/Sylius\\Component\\Shipping\\Processor/g' {} \; ``` ### Taxation Model classes and Symfony agnostic services have been moved to ``Sylius\Component\Taxation`` namespace. ```bash $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\TaxationBundle\\Model/Sylius\\Component\\Taxation\\Model/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\TaxationBundle\\Calculator/Sylius\\Component\\Taxation\\Calculator/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\TaxationBundle\\Resolver/Sylius\\Component\\Taxation\\Resolver/g' {} \; ``` ### Taxonomy TaxonomiesBundle has been renamed to TaxonomyBundle. Model classes interfaces have been moved to ``Sylius\Component\Taxonomy`` namespace. ```bash $ find ./src -type f -exec sed -i 's/TaxonomiesBundle/TaxonomyBundle/g' {} \; $ find ./src -type f -exec sed -i 's/Sylius\\Bundle\\TaxonomyBundle\\Model/Sylius\\Component\\Taxonomy\\Model/g' {} \; ``` Configuration root node has been adjusted as well. Before: ```yaml sylius_taxonomies: driver: doctrine/orm ``` After: ```yaml sylius_taxonomy: driver: doctrine/orm ``` ### Web Twig extension service name was changed: * `sylius.twig.text_extension` into `sylius.twig.extension.text`