← Налаштування Doctrine Behaviors
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` під тим самим ідентифікатором класу.