docs: Doctrine section with Doctrine Behaviors and Doctrine Helper (uk + en)
uk/docs/doctrine/doctrine-behaviors/sluggable.md
новий файл +74
−0
1
+
# Sluggable
2
+
3
+
Генерує slug — частину URL на кшталт `/post/introduction-to-php` — з одного чи кількох полів сутності.
4
+
5
+
## Сутність
6
+
7
+
```php
8
+
use Doctrine\ORM\Mapping as ORM;
9
+
use Ufo\DoctrineBehaviors\Contract\Entity\SluggableInterface;
10
+
use Ufo\DoctrineBehaviors\Model\Sluggable\SluggableTrait;
11
+
12
+
#[ORM\Entity]
13
+
class BlogPost implements SluggableInterface
14
+
{
15
+
use SluggableTrait;
16
+
17
+
#[ORM\Id, ORM\GeneratedValue, ORM\Column]
18
+
private ?int $id = null;
19
+
20
+
#[ORM\Column]
21
+
private string $title = '';
22
+
23
+
/**
24
+
* @return string[]
25
+
*/
26
+
public function getSluggableFields(): array
27
+
{
28
+
return ['title'];
29
+
}
30
+
}
31
+
```
32
+
33
+
Бандл мапить `slug` (рядок, nullable), якщо поле ще не змаплене.
34
+
35
+
## Як це працює
36
+
37
+
На `prePersist` і `preUpdate` викликається `generateSlug()`:
38
+
39
+
* значення кожного поля з `getSluggableFields()` береться з властивості, а якщо її немає — з методу `get<Поле>()`;
40
+
* порожні значення пропускаються, решта склеюються пробілом і перетворюються `Symfony\Component\String\Slugger\AsciiSlugger` з розділювачем `-` і в нижньому регістрі: `Žluťoučký kůň` → `zlutoucky-kun`;
41
+
* якщо всі значення порожні — `Ufo\DoctrineBehaviors\Exception\SluggableException`.
42
+
43
+
За замовчуванням slug перегенеровується при кожному оновленні сутності.
44
+
45
+
## Унікальність
46
+
47
+
За замовчуванням унікальність не гарантується. Щоб її ввімкнути, перевизначте `shouldGenerateUniqueSlugs()`:
48
+
49
+
```php
50
+
public function shouldGenerateUniqueSlugs(): bool
51
+
{
52
+
return true;
53
+
}
54
+
```
55
+
56
+
Тоді до зайнятого slug додається суфікс `-1`, `-2`, …: перевіряються рядки того самого класу в базі (крім самої сутності) і сутності, заплановані в поточному `flush()`.
57
+
58
+
## Що можна перевизначити
59
+
60
+
| Метод трейта | За замовчуванням | Призначення |
61
+
| --- | --- | --- |
62
+
| `shouldGenerateUniqueSlugs(): bool` | `false` | Додавати числовий суфікс до зайнятого slug. |
63
+
| `shouldRegenerateSlugOnUpdate(): bool` | `true` | `false` — slug генерується один раз і далі не змінюється. |
64
+
| `getSlugDelimiter(): string` | `-` | Розділювач слів. |
65
+
| `generateSlugValue(array $values): string` | `AsciiSlugger` | Власний алгоритм. |
66
+
67
+
Усі ці методи, крім `shouldGenerateUniqueSlugs()`, у трейті приватні — сутність просто оголошує власний метод з тією самою назвою:
68
+
69
+
```php
70
+
private function shouldRegenerateSlugOnUpdate(): bool
71
+
{
72
+
return false;
73
+
}
74
+
```