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
+
:::