Sluggable

← Sluggable

Ashterix

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