Налаштування Doctrine Behaviors

← Налаштування Doctrine Behaviors

Ashterix

docs: Doctrine section with Doctrine Behaviors and Doctrine Helper (uk + en)

uk/docs/doctrine/doctrine-behaviors/config.md новий файл +92 −0

Налаштування Doctrine Behaviors

Бандл не має власного розділу конфігурації. Поведінка змінюється параметрами контейнера та заміною двох провайдерів.

Параметри

Задайте потрібні параметри в config/services.yaml (значення застосунку мають пріоритет над значеннями бандла):

# config/services.yaml
parameters:
    doctrine_behaviors_blameable_user_entity: App\Entity\User
    doctrine_behaviors_timestampable_date_field_type: datetimetz
    doctrine_behaviors_translatable_fetch_mode: LAZY
    doctrine_behaviors_translation_fetch_mode: LAZY
Параметр За замовчуванням Що змінює
doctrine_behaviors_blameable_user_entity null Клас сутності користувача. Якщо задано і клас існує, createdBy / updatedBy / deletedBy мапляться як ManyToOne на цю сутність; інакше — рядкові колонки. Див. Blameable.
doctrine_behaviors_timestampable_date_field_type datetime Тип Doctrine для createdAt / updatedAt. Див. Timestampable.
doctrine_behaviors_translatable_fetch_mode LAZY Стратегія завантаження колекції translations сутності, що перекладається: LAZY, EAGER, EXTRA_LAZY.
doctrine_behaviors_translation_fetch_mode LAZY Стратегія завантаження зв'язку translatable сутності перекладу; ті самі значення.

Будь-яке інше значення fetch mode трактується як LAZY. Детальніше — Translatable.

Провайдер користувача

Blameable бере поточного користувача з Ufo\DoctrineBehaviors\Contract\Provider\UserProviderInterface. Типова реалізація Ufo\DoctrineBehaviors\Provider\UserProvider повертає getUser() з токена Symfony Security (якщо задано doctrine_behaviors_blameable_user_entity — лише екземпляр цього класу) або null, коли токена немає.

Власна реалізація — наприклад, щоб зберігати ідентифікатор користувача рядком:

namespace App\Doctrine;

use Symfony\Bundle\SecurityBundle\Security;
use Ufo\DoctrineBehaviors\Contract\Provider\UserProviderInterface;

final class UserIdentifierProvider implements UserProviderInterface
{
    public function __construct(private Security $security) {}

    public function provideUser(): ?string
    {
        return $this->security->getUser()?->getUserIdentifier();
    }

    public function provideUserEntity(): ?string
    {
        return null;
    }
}
# config/services.yaml
services:
    Ufo\DoctrineBehaviors\Contract\Provider\UserProviderInterface: '@App\Doctrine\UserIdentifierProvider'

Якщо provideUser() повертає null, Blameable нічого не змінює.

Провайдер локалі

Translatable бере локалі з Ufo\DoctrineBehaviors\Contract\Provider\LocaleProviderInterface:

  • provideCurrentLocale() — локаль поточного запиту, без запиту — null; якщо локаль запиту порожня — локаль TranslatorInterface;
  • provideFallbackLocale() — локаль за замовчуванням запиту, без запиту — параметр locale, а якщо його немає — kernel.default_locale.

Замінюється так само, як провайдер користувача:

services:
    Ufo\DoctrineBehaviors\Contract\Provider\LocaleProviderInterface: '@App\Doctrine\MyLocaleProvider'

Слухачі Doctrine

Кожна поведінка — окремий клас у Ufo\DoctrineBehaviors\EventSubscriber, зареєстрований атрибутом #[AsDoctrineListener] з пріоритетом 500 для з'єднання default:

Слухач Події
TimestampableEventSubscriber loadClassMetadata
BlameableEventSubscriber loadClassMetadata, prePersist, preUpdate, preRemove
SoftDeletableEventSubscriber loadClassMetadata, onFlush
TranslatableEventSubscriber loadClassMetadata, postLoad, prePersist
SluggableEventSubscriber loadClassMetadata, prePersist, preUpdate
TreeEventSubscriber loadClassMetadata
UuidableEventSubscriber loadClassMetadata, prePersist
LoggableEventSubscriber postPersist, postUpdate, preRemove

Сервіси бандла публічні й автовайряться, тож будь-який слухач можна перевизначити в config/services.yaml під тим самим ідентифікатором класу.