Перейти к основному содержимому

Переопределение моделей и сущностей в Pimcore

Иногда возникает необходимость изменить или расширить стандартную функциональность базовых моделей Pimcore. Для этого предусмотрена возможность подмены основных моделей вашими собственными классами.

На данный момент переопределение работает для всех реализаций следующих классов (но не для самих этих абстрактных классов напрямую):

  • Pimcore\Model\Document
  • Pimcore\Model\Document\Listing
  • Pimcore\Model\AbstractObject
  • Pimcore\Model\DataObject\Listing
  • Pimcore\Model\Asset
  • Pimcore\Model\Asset\Listing

Вы можете переопределить класс листинга для конкретного класса данных, например: Pimcore\Model\DataObject\News\Listing или модель изображения Pimcore\Model\Asset\Image.

Вы не можете переопределить сам класс Pimcore\Model\Asset (или другие базовые абстрактные модели), так как они являются родительскими для конкретных типов (например, для того же Asset\Image), и их подмена означала бы нарушение иерархии классов.

Настройка переопределения

Конфигурация представляет собой простую карту соответствий «ключ-значение» в файле config/config.yaml. Используйте ключ pimcore.models.class_overrides, например:

pimcore:  
models:
class_overrides:
'Pimcore\Model\DataObject\News': 'App\Model\DataObject\News'
'Pimcore\Model\DataObject\News\Listing': 'App\Model\DataObject\News\Listing'

Очень важно, чтобы ваш переопределяющий класс расширял исходный класс, иначе вы сломаете всю систему.

Не забудьте очистить все кэши (Symfony + Data Cache) после того, как вы настроили переопределение класса ./bin/console cache:clear --no-warmup && ./bin/console pimcore:cache:clear

Пример

В вашем config/config.yaml:

pimcore:  
models:
class_overrides:
'Pimcore\Model\DataObject\News': 'App\Model\DataObject\News'

Ваш App\Model\DataObject\News:

<?php   

namespace App\Model\DataObject;

class News extends \Pimcore\Model\DataObject\News
{
// Ваша кастомная логика
public function getMyCustomAttribute(): mixed
{
...
}
}


Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.