Вы можете валидировать данные, которые приходят в контроллер через
кастомные Request-классы. Там вы можете указать такую конструкцию:
public function rules()
{
return [
'slug' => [
'string',
'unique:posts,slug'
],
];
}
Если при проверке Slug он уже есть в базе, то выводится ошибка валидации.
Чтобы слаг генерировался на лету, можете в том же кастомном Request реализовать
метод:
protected function prepareForValidation() :void
{
$this->merge([
'slug' => ($this->slug) ?? \Str::slug($this->title, '-')
]);
}
То есть перед самой валидацией ваших данных к этим данным добавится сгенерированный из заголовка слаг, если поле осталось пустым, либо тот слаг, что вы указали