Sluggable

← Sluggable

Ashterix

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

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

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;
}