Timestampable

← Timestampable

Ashterix

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

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

1 + # Timestampable
2 +
3 + Зберігає час створення і останньої зміни сутності.
4 +
5 + ## Сутність
6 +
7 + ```php
8 + use Doctrine\ORM\Mapping as ORM;
9 + use Ufo\DoctrineBehaviors\Contract\Entity\TimestampableInterface;
10 + use Ufo\DoctrineBehaviors\Model\Timestampable\TimestampableTrait;
11 +
12 + #[ORM\Entity]
13 + class Category implements TimestampableInterface
14 + {
15 + use TimestampableTrait;
16 +
17 + #[ORM\Id, ORM\GeneratedValue, ORM\Column]
18 + private ?int $id = null;
19 + }
20 + ```
21 +
22 + ## Як це працює
23 +
24 + * Під час `loadClassMetadata` бандл мапить `createdAt` і `updatedAt` (nullable, тип із параметра `doctrine_behaviors_timestampable_date_field_type`, за замовчуванням `datetime`) і додає lifecycle callback `updateTimestamps()` на `prePersist` і `preUpdate`. Атрибут `#[ORM\HasLifecycleCallbacks]` не потрібен.
25 + * `updateTimestamps()` ставить `createdAt`, якщо він ще `null`, і завжди оновлює `updatedAt`. Час береться з мікросекундами, у часовому поясі `date_default_timezone_get()`.
26 + * `preUpdate` Doctrine викликає лише для сутностей зі зміненими полями — `flush()` без змін `updatedAt` не чіпає.
27 + * `#[ORM\MappedSuperclass]` пропускається; колонки отримують сутності-нащадки.
28 +
29 + ## Використання
30 +
31 + ```php
32 + $category = new Category();
33 + $entityManager->persist($category);
34 + $entityManager->flush();
35 +
36 + $category->getCreatedAt(); // DateTime
37 + $category->getUpdatedAt(); // DateTime
38 + ```
39 +
40 + `setCreatedAt()` і `setUpdatedAt()` дозволяють задати значення вручну; заданий `createdAt` при збереженні не перезаписується.
41 +
42 + ## Налаштування
43 +
44 + ```yaml
45 + # config/services.yaml
46 + parameters:
47 + doctrine_behaviors_timestampable_date_field_type: datetimetz
48 + ```
49 +
50 + :::warning
51 + Трейт записує `DateTime`, тому підходять лише змінювані типи — `datetime` і `datetimetz`. Типи `*_immutable` очікують `DateTimeImmutable` і не сумісні.
52 + :::