Blameable

← Blameable

Ashterix

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

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

1 + # Blameable
2 +
3 + Зберігає, хто створив, востаннє змінив і видалив сутність.
4 +
5 + ## Сутність
6 +
7 + ```php
8 + use Doctrine\ORM\Mapping as ORM;
9 + use Ufo\DoctrineBehaviors\Contract\Entity\BlameableInterface;
10 + use Ufo\DoctrineBehaviors\Model\Blameable\BlameableTrait;
11 +
12 + #[ORM\Entity]
13 + class Category implements BlameableInterface
14 + {
15 + use BlameableTrait;
16 +
17 + #[ORM\Id, ORM\GeneratedValue, ORM\Column]
18 + private ?int $id = null;
19 + }
20 + ```
21 +
22 + ## Мапінг
23 +
24 + Залежить від параметра `doctrine_behaviors_blameable_user_entity`:
25 +
26 + | Параметр | Поля `createdBy`, `updatedBy`, `deletedBy` |
27 + | --- | --- |
28 + | не задано (`null`) | рядкові колонки, nullable |
29 + | клас сутності користувача | `ManyToOne` на цю сутність (колонки `createdBy_id` тощо, `ON DELETE SET NULL`) |
30 +
31 + ```yaml
32 + # config/services.yaml
33 + parameters:
34 + doctrine_behaviors_blameable_user_entity: App\Entity\User
35 + ```
36 +
37 + Поле, вже змапене в сутності, бандл не чіпає.
38 +
39 + ## Як це працює
40 +
41 + Користувача повертає `UserProviderInterface` (див. [Налаштування](/docs/doctrine/doctrine-behaviors/config)). Якщо він `null` (немає токена, консольна команда), значення не змінюються.
42 +
43 + | Подія | Що відбувається |
44 + | --- | --- |
45 + | `prePersist` | `createdBy` і `updatedBy`, якщо вони порожні |
46 + | `preUpdate` | `updatedBy` |
47 + | `preRemove` | `deletedBy` |
48 +
49 + :::warning
50 + Типовий `UserProvider` повертає об'єкт користувача з токена. Якщо параметр `doctrine_behaviors_blameable_user_entity` не задано, колонки рядкові — у такому разі або задайте параметр, або підставте провайдер, що повертає рядок (приклад `getUserIdentifier()` — у [Налаштуваннях](/docs/doctrine/doctrine-behaviors/config)).
51 + :::
52 +
53 + ## Використання
54 +
55 + ```php
56 + $category = new Category();
57 + $entityManager->persist($category);
58 + $entityManager->flush();
59 +
60 + $category->getCreatedBy(); // App\Entity\User або рядок — залежно від мапінгу
61 + $category->getUpdatedBy();
62 + $category->getDeletedBy(); // null
63 + ```