Налаштування 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

1 + # Налаштування Doctrine Behaviors
2 +
3 + Бандл не має власного розділу конфігурації. Поведінка змінюється параметрами контейнера та заміною двох провайдерів.
4 +
5 + ## Параметри
6 +
7 + Задайте потрібні параметри в `config/services.yaml` (значення застосунку мають пріоритет над значеннями бандла):
8 +
9 + ```yaml
10 + # config/services.yaml
11 + parameters:
12 + doctrine_behaviors_blameable_user_entity: App\Entity\User
13 + doctrine_behaviors_timestampable_date_field_type: datetimetz
14 + doctrine_behaviors_translatable_fetch_mode: LAZY
15 + doctrine_behaviors_translation_fetch_mode: LAZY
16 + ```
17 +
18 + | Параметр | За замовчуванням | Що змінює |
19 + | --- | --- | --- |
20 + | `doctrine_behaviors_blameable_user_entity` | `null` | Клас сутності користувача. Якщо задано і клас існує, `createdBy` / `updatedBy` / `deletedBy` мапляться як `ManyToOne` на цю сутність; інакше — рядкові колонки. Див. [Blameable](/docs/doctrine/doctrine-behaviors/blameable). |
21 + | `doctrine_behaviors_timestampable_date_field_type` | `datetime` | Тип Doctrine для `createdAt` / `updatedAt`. Див. [Timestampable](/docs/doctrine/doctrine-behaviors/timestampable). |
22 + | `doctrine_behaviors_translatable_fetch_mode` | `LAZY` | Стратегія завантаження колекції `translations` сутності, що перекладається: `LAZY`, `EAGER`, `EXTRA_LAZY`. |
23 + | `doctrine_behaviors_translation_fetch_mode` | `LAZY` | Стратегія завантаження зв'язку `translatable` сутності перекладу; ті самі значення. |
24 +
25 + Будь-яке інше значення fetch mode трактується як `LAZY`. Детальніше — [Translatable](/docs/doctrine/doctrine-behaviors/translatable).
26 +
27 + ## Провайдер користувача
28 +
29 + Blameable бере поточного користувача з `Ufo\DoctrineBehaviors\Contract\Provider\UserProviderInterface`. Типова реалізація `Ufo\DoctrineBehaviors\Provider\UserProvider` повертає `getUser()` з токена Symfony Security (якщо задано `doctrine_behaviors_blameable_user_entity` — лише екземпляр цього класу) або `null`, коли токена немає.
30 +
31 + Власна реалізація — наприклад, щоб зберігати ідентифікатор користувача рядком:
32 +
33 + ```php
34 + namespace App\Doctrine;
35 +
36 + use Symfony\Bundle\SecurityBundle\Security;
37 + use Ufo\DoctrineBehaviors\Contract\Provider\UserProviderInterface;
38 +
39 + final class UserIdentifierProvider implements UserProviderInterface
40 + {
41 + public function __construct(private Security $security) {}
42 +
43 + public function provideUser(): ?string
44 + {
45 + return $this->security->getUser()?->getUserIdentifier();
46 + }
47 +
48 + public function provideUserEntity(): ?string
49 + {
50 + return null;
51 + }
52 + }
53 + ```
54 +
55 + ```yaml
56 + # config/services.yaml
57 + services:
58 + Ufo\DoctrineBehaviors\Contract\Provider\UserProviderInterface: '@App\Doctrine\UserIdentifierProvider'
59 + ```
60 +
61 + Якщо `provideUser()` повертає `null`, Blameable нічого не змінює.
62 +
63 + ## Провайдер локалі
64 +
65 + Translatable бере локалі з `Ufo\DoctrineBehaviors\Contract\Provider\LocaleProviderInterface`:
66 +
67 + * `provideCurrentLocale()` — локаль поточного запиту, без запиту — `null`; якщо локаль запиту порожня — локаль `TranslatorInterface`;
68 + * `provideFallbackLocale()` — локаль за замовчуванням запиту, без запиту — параметр `locale`, а якщо його немає — `kernel.default_locale`.
69 +
70 + Замінюється так само, як провайдер користувача:
71 +
72 + ```yaml
73 + services:
74 + Ufo\DoctrineBehaviors\Contract\Provider\LocaleProviderInterface: '@App\Doctrine\MyLocaleProvider'
75 + ```
76 +
77 + ## Слухачі Doctrine
78 +
79 + Кожна поведінка — окремий клас у `Ufo\DoctrineBehaviors\EventSubscriber`, зареєстрований атрибутом `#[AsDoctrineListener]` з пріоритетом `500` для з'єднання `default`:
80 +
81 + | Слухач | Події |
82 + | --- | --- |
83 + | `TimestampableEventSubscriber` | `loadClassMetadata` |
84 + | `BlameableEventSubscriber` | `loadClassMetadata`, `prePersist`, `preUpdate`, `preRemove` |
85 + | `SoftDeletableEventSubscriber` | `loadClassMetadata`, `onFlush` |
86 + | `TranslatableEventSubscriber` | `loadClassMetadata`, `postLoad`, `prePersist` |
87 + | `SluggableEventSubscriber` | `loadClassMetadata`, `prePersist`, `preUpdate` |
88 + | `TreeEventSubscriber` | `loadClassMetadata` |
89 + | `UuidableEventSubscriber` | `loadClassMetadata`, `prePersist` |
90 + | `LoggableEventSubscriber` | `postPersist`, `postUpdate`, `preRemove` |
91 +
92 + Сервіси бандла публічні й автовайряться, тож будь-який слухач можна перевизначити в `config/services.yaml` під тим самим ідентифікатором класу.