Этот пакет предоставляет функцию, которая будет генерировать уникальный фрагмент при сохранении любой модели Eloquent.
$model = new EloquentModel();$model->name = 'activerecord - это здорово';$model->save();echo $model->slug; // выводит "activerecord-is-awesome"
Слаги генерируются с помощью метода Laravels Str::slug
, при котором пробелы преобразуются в '-'.
Spatie — агентство веб-дизайна, базирующееся в Антверпене, Бельгия. На нашем сайте вы найдете обзор всех наших проектов с открытым исходным кодом.
Мы вкладываем много ресурсов в создание лучших в своем классе пакетов с открытым исходным кодом. Вы можете поддержать нас, купив один из наших платных продуктов.
Мы очень признательны вам за отправку нам открытки из вашего родного города с указанием того, какой из наших пакетов вы используете. Наш адрес вы найдете на странице контактов. Все полученные открытки мы публикуем на нашей виртуальной стене открыток.
Вы можете установить пакет через композитор:
композитору требуется spatie/laravel-sluggable
Ваши модели Eloquent должны использовать признак SpatieSluggableHasSlug
и класс SpatieSluggableSlugOptions
.
Эта черта содержит абстрактный метод getSlugOptions()
, который вы должны реализовать самостоятельно.
Миграции ваших моделей должны иметь поле для сохранения сгенерированного фрагмента.
Вот пример реализации этой черты:
пространство имен App; используйте SpatieSluggableHasSlug; используйте SpatieSluggableSlugOptions; используйте IlluminateDatabaseEloquentModel; класс YourEloquentModel расширяет модель {use HasSlug;/** * Получите параметры для создания пула. */публичная функция getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('имя') ->saveSlugsTo('слизняк'); } }
С его миграцией:
использовать IlluminateDatabaseMigrationsMigration; использовать IlluminateDatabaseSchemaBlueprint; использовать IlluminateSupportFacadesSchema; класс CreateYourEloquentModelTable расширяет миграцию {публичная функция вверх() { Schema::create('your_eloquent_models', function (Blueprint $table) {$table->increments('id');$table->string('slug'); // Имя поля такое же, как у вашей `saveSlugsTo`$table ->string('name');$table->timestamps(); }); } }
Чтобы использовать сгенерированный фрагмент в маршрутах, не забудьте использовать неявную привязку модели маршрута Laravel:
пространство имен App; используйте SpatieSluggableHasSlug; используйте SpatieSluggableSlugOptions; используйте IlluminateDatabaseEloquentModel; класс YourEloquentModel расширяет модель {use HasSlug;/** * Получите параметры для создания пула. */публичная функция getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('имя') ->saveSlugsTo('слизняк'); }/** * Получите ключ маршрута для модели. * * @return string */public function getRouteKeyName() {вернуть 'слизняк'; } }
Хотите использовать несколько полей в качестве основы для пула? Без проблем!
публичная функция getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom(['first_name', 'last_name']) ->saveSlugsTo('слизняк'); }
Вы также можете передать callable
generateSlugsFrom
.
По умолчанию пакет генерирует уникальные пули, добавляя «-» и номер к уже существующему пулу.
Вы можете отключить это поведение, allowDuplicateSlugs
.
публичная функция getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('имя') ->saveSlugsTo('слизняк') ->allowDudicateSlugs(); }
Вы также можете установить максимальный размер создаваемого фрагмента:
публичная функция getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('имя') ->saveSlugsTo('слизняк') -> слизниДолжныбытьNoLongerThan(50); }
Слаг может быть немного длиннее указанного значения из-за суффикса, который добавляется для придания ему уникальности.
Вы также можете использовать собственный разделитель, вызвав usingSeparator
публичная функция getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('имя') ->saveSlugsTo('слизняк') ->usingSeparator('_'); }
Чтобы установить язык, используемый Str::slug
вы можете вызвать usingLanguage
публичная функция getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('имя') ->saveSlugsTo('слизняк') ->usingLanguage('nl'); }
Вы также можете переопределить сгенерированный пул, просто установив для него другое значение, отличное от сгенерированного пула.
$model = EloquentModel::create(['name' => 'мое имя']); // слаг теперь «мое имя»; $model->slug = 'my-custom-url';$model->save(); // слаг теперь "my-custom-url";
Если вы не хотите создавать пул, когда модель имеет состояние, вы можете использовать функцию skipGenerateWhen
.
публичная функция getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('имя') ->saveSlugsTo('слизняк') ->skipGenerateWhen(fn () => $this->state === 'черновик'); }
Если вы не хотите создавать пул при первоначальном создании модели, вы можете использовать функцию doNotGenerateSlugsOnCreate()
.
публичная функция getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('имя') ->saveSlugsTo('слизняк') ->doNotGenerateSlugsOnCreate(); }
Аналогично, если вы хотите предотвратить обновление пула при обновлении модели, вызовите doNotGenerateSlugsOnUpdate()
.
публичная функция getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('имя') ->saveSlugsTo('слизняк') ->doNotGenerateSlugsOnUpdate(); }
Это может быть полезно для создания постоянных ссылок, которые не изменяются, пока вы явно этого не захотите.
$model = EloquentModel::create(['name' => 'мое имя']); //ссылка теперь "мое имя";$model->save();$model->name = 'измененное имя';$model->save(); //слизняк остается "мое имя"
Если вы хотите явно обновить пул в модели, вы можете в любое время вызвать generateSlug()
для вашей модели, чтобы создать пул в соответствии с другими вашими параметрами. Не забудьте save()
модель, чтобы сохранить обновление в вашей базе данных.
Вы можете предотвратить перезапись фрагментов.
публичная функция getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('имя') ->saveSlugsTo('слизняк') ->preventOverwrite(); }
Если у вас есть глобальная область видимости, которую следует учитывать, вы также можете определить ее с помощью extraScope
. Например, если у вас есть таблица страниц, содержащая страницы нескольких веб-сайтов, и каждый веб-сайт имеет свои уникальные фрагменты.
публичная функция getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('имя') ->saveSlugsTo('слизняк') ->extraScope(fn ($builder) => $builder->where('scope_id', $this->scope_id)); }
По умолчанию индекс суффикса начинается с 1, вы можете установить начальный номер.
публичная функция getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('имя') ->saveSlugsTo('слизняк') ->startSlugSuffixFrom(2); }
Вы можете использовать этот пакет вместе с laravel-translatable для создания пула для каждой локали. Вместо использования признака HasSlug
вы должны использовать признак HasTranslatableSlug
и добавить имя поля ярлыка в массив $translatable
. Для ярлыков, созданных на основе одного или нескольких полей, больше ничего менять не нужно.
пространство имен App; используйте SpatieSluggableHasTranslatableSlug; используйте SpatieSluggableSlugOptions; используйте SpatieTranslatableHasTranslations; используйте IlluminateDatabaseEloquentModel; класс YourEloquentModel расширяет модель {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * Получите параметры для создания ярлыка. */публичная функция getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('имя') ->saveSlugsTo('слизняк'); } }
Для пулов, созданных из вызываемого объекта, вам необходимо создать экземпляр SlugOptions
с помощью метода createWithLocales
. Вызываемый объект теперь принимает два аргумента вместо одного. И $model
, и $locale
доступны для создания пула.
пространство имен App; используйте SpatieSluggableHasTranslatableSlug; используйте SpatieSluggableSlugOptions; используйте SpatieTranslatableHasTranslations; используйте IlluminateDatabaseEloquentModel; класс YourEloquentModel расширяет модель {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * Получите параметры для создания ярлыка. */public function getSlugOptions() : SlugOptions{return SlugOptions::createWithLocales(['en', 'nl']) ->generateSlugsFrom(function($model, $locale) {return "{$locale} {$model->id}"; }) ->saveSlugsTo('слизняк'); } }
Вы также можете использовать неявную привязку модели маршрута Laravel внутри вашего контроллера для автоматического разрешения модели. Чтобы использовать эту функцию, убедитесь, что столбец ярлыка соответствует routeNameKey
.
В настоящее время только некоторые типы баз данных поддерживают операции JSON. Дополнительную информацию о том, какие базы данных поддерживают JSON, можно найти в документации Laravel.
пространство имен App; используйте SpatieSluggableHasSlug; используйте SpatieSluggableSlugOptions; используйте IlluminateDatabaseEloquentModel; класс YourEloquentModel расширяет модель {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * Получите параметры для создания ярлыка. */публичная функция getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('имя') ->saveSlugsTo('слизняк'); }/** * Получите ключ маршрута для модели. * * @return string */public function getRouteKeyName() {вернуть 'слизняк'; } }
Для удобства вы можете использовать псевдоним findBySlug
для получения модели. Запрос будет сравниваться с полем, переданным в saveSlugsTo
при определении SlugOptions
.
$model = Article::findBySlug('моя-статья');
findBySlug
также принимает второй параметр $columns
, как и метод find
Eloquent по умолчанию.
Пожалуйста, посетите CHANGELOG для получения дополнительной информации о том, что изменилось за последнее время.
композиторский тест
Пожалуйста, смотрите ВКЛАД для получения подробной информации.
Если вы обнаружили ошибку, связанную с безопасностью, отправьте электронное письмо по адресу [email protected] вместо использования системы отслеживания проблем.
Фрик Ван дер Хертен
Все участники
Лицензия MIT (MIT). Пожалуйста, смотрите файл лицензии для получения дополнительной информации.