このパッケージは、Eloquent モデルを保存するときに固有のスラッグを生成する特性を提供します。
$model = new EloquentModel();$model->name = 'activerecord は素晴らしい';$model->save();echo $model->slug; // 「activerecord-is-awesome」を出力します
スラグはLaravels Str::slug
メソッドを使用して生成され、スペースは「-」に変換されます。
Spatie は、ベルギーのアントワープに拠点を置くウェブデザイン会社です。当社のすべてのオープンソース プロジェクトの概要は、当社の Web サイトでご覧いただけます。
私たちはクラス最高のオープンソース パッケージの作成に多くのリソースを投資しています。有料製品のいずれかを購入することで、私たちをサポートできます。
当社のどのパッケージを使用しているかについて、故郷から葉書を送っていただき、誠にありがとうございます。当社の住所は、お問い合わせページに記載されています。受け取ったすべてのポストカードをバーチャル ポストカード ウォールに公開します。
パッケージは、composer 経由でインストールできます。
作曲家には spatie/laravel-sluggable が必要です
Eloquent モデルでは、 SpatieSluggableHasSlug
トレイトとSpatieSluggableSlugOptions
クラスを使用する必要があります。
トレイトには、自分で実装する必要がある抽象メソッドgetSlugOptions()
が含まれています。
モデルの移行には、生成されたスラッグを保存するフィールドが必要です。
特性を実装する方法の例を次に示します。
名前空間 App;SpatieSluggableHasSlug を使用;SpatieSluggableSlugOptions を使用;IlluminateDatabaseEloquentModel を使用;クラス YourEloquentModel は Model を拡張します {use HasSlug;/** * スラグを生成するためのオプションを取得します。 */public function getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('名前') ->saveSlugsTo('ナメクジ'); } }
移行により:
IlluminateDatabaseMigrationsMigration を使用する;IlluminateDatabaseSchemaBlueprint を使用する;IlluminateSupportFacadesSchema を使用する;クラス CreateYourEloquentModelTable は Migration を拡張します {パブリック関数 up() { 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 は Model を拡張します {use HasSlug;/** * スラグを生成するためのオプションを取得します。 */public function getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('名前') ->saveSlugsTo('ナメクジ'); }/** * モデルのルートキーを取得します。 * * @return string */public function getRouteKeyName() {「ナメクジ」を返す; } }
スラッグのベースとして複数のフィールドを使用したいですか?問題ない!
public function getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom(['first_name', 'last_name']) ->saveSlugsTo('ナメクジ'); }
callable
をgenerateSlugsFrom
に渡すこともできます。
デフォルトでは、パッケージは、すでに存在するスラッグに「-」と数字を追加することによって一意のスラッグを生成します。
この動作を無効にするには、 allowDuplicateSlugs
を呼び出します。
public function getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('名前') ->saveSlugsTo('ナメクジ') ->allowDuplicateSlugs(); }
作成されたスラッグに最大サイズ制限を設けることもできます。
public function getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('名前') ->saveSlugsTo('ナメクジ') ->ナメクジは長すぎるべきではない(50); }
スラグは、一意にするために追加されるサフィックスにより、指定された値よりわずかに長くなる場合があります。
usingSeparator
を呼び出してカスタム セパレータを使用することもできます。
public function getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('名前') ->saveSlugsTo('ナメクジ') ->usingSeparator('_'); }
Str::slug
で使用される言語を設定するには、 usingLanguage
を呼び出します。
public function getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('名前') ->saveSlugsTo('ナメクジ') ->usingLanguage('nl'); }
生成されたスラッグを、生成されたスラッグとは別の値に設定するだけでオーバーライドすることもできます。
$model = EloquentModel::create(['名前' => '私の名前']); //slug は "my-name" になりました;$model->slug = 'my-custom-url';$model->save(); //スラッグは「my-custom-url」になりました。
モデルに状態があるときにスラッグを作成したくない場合は、 skipGenerateWhen
関数を使用できます。
public function getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('名前') ->saveSlugsTo('ナメクジ') ->skipGenerateWhen(fn () => $this->state === 'ドラフト'); }
モデルの最初の作成時にスラグを作成したくない場合は、 doNotGenerateSlugsOnCreate()
関数を使用するように設定できます。
public function getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('名前') ->saveSlugsTo('ナメクジ') ->doNotGenerateSlugsOnCreate(); }
同様に、モデルの更新時にスラグが更新されないようにするには、 doNotGenerateSlugsOnUpdate()
を呼び出します。
public function getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('名前') ->saveSlugsTo('ナメクジ') ->doNotGenerateSlugsOnUpdate(); }
これは、明示的に変更するまで変更されないパーマリンクを作成する場合に役立ちます。
$model = EloquentModel::create(['名前' => '私の名前']); //スラッグは "my-name" になりました;$model->save();$model->name = '変更された名前';$model->save(); //ナメクジは「私の名前」のままです
モデル上のスラグを明示的に更新したい場合は、いつでもモデル上でgenerateSlug()
呼び出して、他のオプションに従ってスラグを作成できます。データベースへの更新を永続化するためにモデルをsave()
することを忘れないでください。
スラッグが上書きされるのを防ぐことができます。
public function getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('名前') ->saveSlugsTo('ナメクジ') ->preventOverwrite(); }
考慮すべきグローバル スコープがある場合は、 extraScope
を使用してこれも定義できます。たとえば、複数の Web サイトのページを含むページ テーブルがあり、各 Web サイトに独自の固有のスラッグがあるとします。
public function getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('名前') ->saveSlugsTo('ナメクジ') ->extraScope(fn ($builder) => $builder->where('scope_id', $this->scope_id)); }
デフォルトでは、サフィックスインデックスは 1 から始まりますが、開始番号を設定できます。
public function getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('名前') ->saveSlugsTo('ナメクジ') ->startSlugSuffixFrom(2); }
このパッケージをlaravel-translatableと一緒に使用すると、ロケールごとにスラッグを生成できます。 HasSlug
トレイトを使用する代わりに、 HasTranslatableSlug
トレイトを使用し、slug フィールドの名前を$translatable
配列に追加する必要があります。単一のフィールドまたは複数のフィールドから生成されたスラッグの場合は、他に何も変更する必要はありません。
名前空間 App; SpatieSluggableHasTranslatableSlug を使用; SpatieSluggableSlugOptions を使用; SpatieTranslatableHasTranslations を使用; IlluminateDatabaseEloquentModel を使用; クラス YourEloquentModel は Model を拡張します {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * スラグを生成するためのオプションを取得します。 */public function getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('名前') ->saveSlugsTo('ナメクジ'); } }
呼び出し可能オブジェクトから生成されたスラッグの場合は、 createWithLocales
メソッドを使用してSlugOptions
インスタンス化する必要があります。呼び出し可能関数は、1 つではなく 2 つの引数を取るようになりました。 $model
と$locale
両方をスラッグの生成に使用できます。
名前空間 App; SpatieSluggableHasTranslatableSlug を使用; SpatieSluggableSlugOptions を使用; SpatieTranslatableHasTranslations を使用; IlluminateDatabaseEloquentModel を使用; クラス YourEloquentModel は Model を拡張します {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('ナメクジ'); } }
コントローラー内で Laravels の暗黙的なルート モデル バインディングを使用して、モデルを自動的に解決することもできます。この機能を使用するには、slug 列がrouteNameKey
と一致することを確認してください。
現在、JSON 操作をサポートしているのは一部のデータベース タイプのみです。 JSON をサポートするデータベースの詳細については、Laravel ドキュメントを参照してください。
名前空間 App;SpatieSluggableHasSlug を使用;SpatieSluggableSlugOptions を使用;IlluminateDatabaseEloquentModel を使用;クラス YourEloquentModel は Model を拡張します {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * スラグを生成するためのオプションを取得します。 */public function getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('名前') ->saveSlugsTo('ナメクジ'); }/** * モデルのルートキーを取得します。 * * @return string */public function getRouteKeyName() {「ナメクジ」を返す; } }
便宜上、エイリアスfindBySlug
使用してモデルを取得できます。クエリは、 SlugOptions
定義するときにsaveSlugsTo
に渡されるフィールドと比較されます。
$model = Article::findBySlug('my-article');
findBySlug
デフォルトの Eloquent find
メソッドと同様に、2 番目のパラメーター$columns
受け入れます。
最近の変更点の詳細については、CHANGELOG を参照してください。
作曲家テスト
詳細については、「貢献」を参照してください。
セキュリティに関するバグを見つけた場合は、問題トラッカーを使用する代わりに [email protected] にメールを送信してください。
フリーク・ファン・デル・ヘルテン
すべての貢献者
MIT ライセンス (MIT)。詳細については、ライセンス ファイルを参照してください。