Edit on GitHub

Upgrade Notes


  • [Ecommerce][IndexService] Elastic Search worker does not use mockup cache anymore. Now mockup objects are build directly based on information in response of ES response (_source flag). Therefore AbstractElasticSearch Worker does not extend AbstractMockupCacheWorker anymore.
  • Rules regarding default values in combination with inheritance enabled have been clarified. Read this for details.
  • [Ecommerce] Deprecated FactFinder integration and will be removed in Pimcore 7.
  • Saving unpublished data objects via API will not throw Validation exceptions anymore (just like Admin UI). Please set omitMandatoryCheck explicitly to false to force mandatory checks.
  • \Pimcore\DataObject\GridColumnConfig\Operator\ObjectBrickGetter operator is deprecated and will be removed in 7.0.0
  • Calling Pimcore\Model\DataObject\ClassDefinition\Data::isEqual() is deprecated since version 6.7.0 and will be removed in version 7 . Implement \Pimcore\Model\DataObject\ClassDefinition\Data\EqualComparisonInterface instead.


  • If you are using the specific settings 'max. items' option for ObjectBricks & Fieldcollections on your class definition, then API will validate the max limit on save() calls from now on.


  • class ElementDescriptor has been moved from 'Pimcore\Model\Version' to 'Pimcore\Model\Element'. The BC layer will be removed in 7. Use the following migration scripts to migrate your version and recyclebin files if necessary.


  • Default config for monolog handler main in prod environment is now stream instead of fingers_crossed. If you still want to use fingers_crossed please update your project config accordingly.

  • app migration set is now located in app/Migrations instead of app/Resources/migrations - Pimcore will automatically move existing migration scripts for you (update your VCS!)

  • Replaced html2text from [Martin Bayer] with Html2Text\Html2Text library. Pimcore\Mail::determineHtml2TextIsInstalled, Pimcore\Mail::getHtml2TextBinaryEnabled, Pimcore\Mail::enableHtml2textBinary, are deprecated in favour of new library and will be removed in Pimcore 7. Also, Pimcore\Mail::setHtml2TextOptions now accepts array options instead of string.

  • Ecommerce: interpreter getters in the application which do not return the correct type: a string or integer field may receive "false" - if false was returned which should actually be null, see #5876

  • Dirty detection \Pimcore\Model\DataObject\DirtyIndicatorInterface & \Pimcore\Model\DataObject\Traits\DirtyIndicatorTrait is deprecated and will be removed in Pimcore 7. Please use new interface \Pimcore\Model\Element\DirtyIndicatorInterface and trait \Pimcore\Model\Element\Traits\DirtyIndicatorTrait instead.

  • Image thumbnails using any (P)JPEG/AUTO format will now all use .jpg as file extension (used to be .jpeg or .pjpeg). You can delete all existing .pjpeg and .jpeg thumbnails as they are not getting used anymore (.jpg files will be newly generated). You can use the following command to delete the obsolete files: find web/var/tmp/image-thumbnails/ -type f \( -iname \*.jpeg -o -iname \*.pjpeg \) -delete
    If you're using pre-generation for your thumbnails, don't forget to run the command (e.g. ./bin/console pimcore:thumbnails:image ...).

  • [Workflows] Added new option save_version to changePublishedState under transitions configuration for documents and objects to save only version while transition from places. e.g.

            from: 'todo'
            to: ['edit_text', 'edit_images']
                label: 'Start Work'
                changePublishedState: save_version


  • Passing multiple relations (w/o multiple assignments check) in data objects is deprecated and will throw exception in Pimcore 7.


If you are using the config option 'Cache Raw Relation Data' on your class definition, please run the following script prior to the update, or disable the option manually in your class definitions

use Pimcore\Model\DataObject\ClassDefinition;

$list = new ClassDefinition\Listing();
$list = $list->load();

foreach ($list as $class) {
    if (method_exists($class, 'getCacheRawRelationData') && $class->getCacheRawRelationData()) {
        // get rid of the CacheRawRelationDataInterface & CacheRawRelationDataTrait
  • [Data Objects] Relations are always lazy-loaded from now on see 5772
  • [Data Objects] Relation Types DB Caching Layer is always turned on now. Removed support for non-cached alternative. All rows of the affected object_relation_ table will be fetched in one go and cached together with the object. see 5427
  • [Data Objects] If you have custom lazy-loaded datatypes not extending Pimcore\Model\DataObject\ClassDefinition\Data\Relations\AbstractRelations, implement the Pimcore\Model\DataObject\ClassDefinition\Data\LazyLoadingSupportInterface The method_exists('getLazyLoading') calls will be removed in Pimcore 7.
  • It is now possible to configure php:memory_limit for web2print:pdf-creation command with following configuration:
      pdf_creation_php_memory_limit: '2048M'
  • Using static methods for dynamic text labels is now deprecated, use services instead.
  • Removed method \Pimcore\Model\DataObject\ClassDefinition\Data\Relations\AbstractRelations::isRemoteOwner(), as this method was only used for ReverseManyToManyObjectRelation internal check are now made using instanceof
  • [Data Objects] inheritance skips now objects of other classes (so far only folders) so with an object path like A (class Product) > B (other class) > C (class Product) object C can inherit data from A.
  • The built in cookie info bar (in system settings) is now marked as deprecated and will be removed in Pimcore 7.
  • \Pimcore\Config::getSystemConfig() is now marked as deprecated and will be removed in Pimcore 7. Use Pimcore\Config service or \Pimcore\Config::getSystemConfiguration() method instead.
  • Javascript function ts(key) (alias of t(key)) is marked as deprecated and will be removed in v7. Please use t(key) instead.


  • Deprecated the REST Webservice API. The API will be removed in Pimcore 7, use the Pimcore Data-Hub instead.

  • Removed Pimcore\Bundle\EcommerceFrameworkBundle\PricingManagerPricingManagerInterface::getRule() and Pimcore\Bundle\EcommerceFrameworkBundle\PricingManager::getRule()

  • The DocumentRenderer::setEventDispatcher() method has been removed. Pass event dispatcher to the constructor instead.

  • RedirectHandler::setRequestHelper() and RedirectHandler::setSiteResolver() methods have been removed. Pass instance of Pimcore\Http\RequestHelper & Pimcore\Http\Request\Resolver\SiteResolver to the constructor instead.

  • The ContainerService::setEventDispatcher() method has been removed and DocumentRenderer event listeners moved toPimcore\Bundle\CoreBundle\EventListener\FrontendDocumentRendererListener

  • Ecommerce: max length of cartId is now 190 characters instead of 255

  • MaxMind GeoIP database is not updated automatically anymore, please read the instructions for setting up geo support for targeting.

  • System Settings - Full Page Cache configuration changed from




    in system.yml to avoid conflicts between output and data cache #5369. If you are using custom config files then you have to migrate them manually. Also new config pimcore:fullpage is disabled by default, so you have to enable fullpage cache again in system settings.

  • Properties $children, $hasChildren, $siblings, $hasSiblings in Pimcore\Model\Document & $o_children, $o_hasChildren, $o_siblings, $o_hasSiblings in Pimcore\Model\AbstractObject uses array to cache result.


  • Asset Metadata: character ~ is not allowed anymore for (predefined/custom) metadata naming. All existing and new metadata name with '~' converts to '---'. This change is introduced to support Localized columns in asset grid #5093
  • Custom document editables now have to implement the method isEmpty() which is defined on \Pimcore\Model\Document\Tag\TagInterface
  • Grid helper functions are moved from bundles/AdminBundle/Resources/public/js/pimcore/object/helpers/gridcolumnconfig.js(removed) to bundles/AdminBundle/Resources/public/js/pimcore/element/helpers/gridColumnConfig.js

Removed jQuery from Admin UI & E-Commerce Back Office

[BC Break] Replaced jQuery functions & libraries with vanilla JS or ExtJS equivalents. Read more
To get jQuery back in the admin UI, please use the this code snippet.

The following files have been removed:



  • Object Keys: characters > and < not allowed anymore.


  • Support for links and folders as a fallback document, details see #4860
  • Documents & DataObjects: save button (visible when user has no publish permission) does not unpublish element anymore (if user has unpublish permission). Details see #4905

Workflow Refactorings

  • Notifications for workflows now support Pimcore notifications. Due to that, some namespaces were renamed. If you don't have overwritten any of the internal classes, no action is needed.
    • Pimcore\Workflow\EventSubscriber\NotificationEmailSubscriber became Pimcore\Workflow\EventSubscriber\NotificationSubscriber
    • Pimcore\Workflow\NotificationEmail\NotificationEmailInterface became Pimcore\Workflow\NotificationEmail\NotificationInterface


  • Sessions: the native PHP session mechanism is now the default (instead of session.handler.native_file). To use the former handler use the following config:
        handler_id:  session.handler.native_file
        save_path:   "%kernel.root_dir%/../var/sessions"

If you have configured your own session handler nothing will change.

  • Bugfix for 6.1.0 - only relevant, when you directly implement interfaces. If you just extend existing E-Commerce Framework implementations, default implementations for the new methods are provided.
    • New method in CartFactoryInterface: public function getCartReadOnlyMode(): string; - default implementation in CartFactory available.


E-Commerce Framework Refactorings

  • New methods in interfaces - only relevant, when you directly implement interfaces. If you just extend existing E-Commerce Framework implementations, default implementations for the new methods are provided.

    • New method in EcommerceFrameworkBundle\EnvironmentInterface: public function setDefaultCurrency(Currency $currency); - default implementation in Environment available.
    • New method in CartInterface: public function getPricingManagerTokenInformationDetails(): array - default implementation in AbstractCart available.
    • New method in CartInterface: public function isCalculated(): bool - default implementation in AbstractCart available.
    • New method in CartPriceCalculatorInterface: public function getAppliedPricingRules(): array; - default implementation in CartPriceCalculator available.
    • New method in BracketInterface: public function getConditionsByType(string $typeClass): array; - default implementation in Bracket available.
    • New method in RuleInterface: public function getConditionsByType(string $typeClass): array - default implementation in Rule available.
    • New method in VoucherServiceInterface: public function getPricingManagerTokenInformationDetails(CartInterface $cart, string $locale = null): array; - default implementation in DefaultService available.
    • New method in CartFactoryInterface: public function getCartReadOnlyMode(): string; - default implementation in CartFactory available.
  • Changed return type of applyCartRules(CartInterface $cart) in PricingManagerInterface - from PricingManagerInterface to array

  • Introduction of new Checkout Manager architecture. It is parallel to the old architecture, which is deprecated now and will be removed in Pimcore 7. For details see Checkout Manager Details.

E-Commerce Back Office

  • Following views are migrated from .php to .twig (with snake_case naming)

  • Link Editables no longer apply configured classes to the editable container. If you have custom css relying on this classes you have to adopt it. see #4740