Sluggable
Генерує slug — частину URL на кшталт /post/introduction-to-php — з одного чи кількох полів сутності.
Сутність
use Doctrine\ORM\Mapping as ORM;
use Ufo\DoctrineBehaviors\Contract\Entity\SluggableInterface;
use Ufo\DoctrineBehaviors\Model\Sluggable\SluggableTrait;
#[ORM\Entity]
class BlogPost implements SluggableInterface
{
use SluggableTrait;
#[ORM\Id, ORM\GeneratedValue, ORM\Column]
private ?int $id = null;
#[ORM\Column]
private string $title = '';
/**
* @return string[]
*/
public function getSluggableFields(): array
{
return ['title'];
}
}
Бандл мапить slug (рядок, nullable), якщо поле ще не змаплене.
Як це працює
На prePersist і preUpdate викликається generateSlug():
- значення кожного поля з
getSluggableFields()береться з властивості, а якщо її немає — з методуget<Поле>(); - порожні значення пропускаються, решта склеюються пробілом і перетворюються
Symfony\Component\String\Slugger\AsciiSluggerз розділювачем-і в нижньому регістрі:Žluťoučký kůň→zlutoucky-kun; - якщо всі значення порожні —
Ufo\DoctrineBehaviors\Exception\SluggableException.
За замовчуванням slug перегенеровується при кожному оновленні сутності.
Унікальність
За замовчуванням унікальність не гарантується. Щоб її ввімкнути, перевизначте shouldGenerateUniqueSlugs():
public function shouldGenerateUniqueSlugs(): bool
{
return true;
}
Тоді до зайнятого slug додається суфікс -1, -2, …: перевіряються рядки того самого класу в базі (крім самої сутності) і сутності, заплановані в поточному flush().
Що можна перевизначити
| Метод трейта | За замовчуванням | Призначення |
|---|---|---|
shouldGenerateUniqueSlugs(): bool |
false |
Додавати числовий суфікс до зайнятого slug. |
shouldRegenerateSlugOnUpdate(): bool |
true |
false — slug генерується один раз і далі не змінюється. |
getSlugDelimiter(): string |
- |
Розділювач слів. |
generateSlugValue(array $values): string |
AsciiSlugger |
Власний алгоритм. |
Усі ці методи, крім shouldGenerateUniqueSlugs(), у трейті приватні — сутність просто оголошує власний метод з тією самою назвою:
private function shouldRegenerateSlugOnUpdate(): bool
{
return false;
}