Метод 1: метод Laravel Str::slug()
Laravel предоставляет удобный вспомогательный метод под названием Str::slug(), который преобразует строку в URL-адресный фрагмент. Однако это не гарантирует уникальности. Мы можем изменить этот метод, чтобы добавить автоматическую нумерацию, если существует повторяющийся фрагмент.
use Illuminate\Support\Str;
function generateUniqueSlug($title)
{
$slug = Str::slug($title);
$count = 1;
while (Model::where('slug', $slug)->exists()) {
$slug = Str::slug($title) . '-' . $count;
$count++;
}
return $slug;
}
Метод 2: использование правила проверки уникальности Laravel.
Правила проверки Laravel можно использовать для обеспечения уникальных фрагментов. Мы можем объединить правило uniqueсо специальным замыканием, чтобы добавить число к слагу, если оно уже существует.
use Illuminate\Validation\Rule;
function generateUniqueSlug($title)
{
$slug = Str::slug($title);
$validator = Validator::make(['slug' => $slug], [
'slug' => Rule::unique('table_name')->where(function ($query) {
return $query->where('column_name', $value);
}),
]);
if ($validator->fails()) {
$count = 1;
while (Validator::make(['slug' => $slug], [
'slug' => Rule::unique('table_name')->where(function ($query) use ($count) {
return $query->where('column_name', $value . '-' . $count);
}),
])->fails()) {
$count++;
}
$slug = $slug . '-' . $count;
}
return $slug;
}
Метод 3: прослушиватели событий Eloquent
Другой подход заключается в использовании прослушивателей событий Eloquent для автоматического создания уникальных фрагментов при каждом создании новой модели. Мы можем использовать событие creatingдля изменения пула перед сохранением его в базе данных.
class Model extends Eloquent
{
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
$slug = Str::slug($model->title);
$count = 1;
while (static::where('slug', $slug)->exists()) {
$slug = Str::slug($model->title) . '-' . $count;
$count++;
}
$model->slug = $slug;
});
}
}
, уникальное правило проверки или прослушиватели событий Eloquent, вы можете легко создавать уникальные фрагменты и обрабатывать дубликаты, добавляя числа. Выберите метод, который лучше всего соответствует требованиям вашего проекта, и начните создавать удобные URL-адреса уже сегодня!