この機能を表示するだけの場合は、 TL、DRに移動します 。
起動時に実行されるEloquentモデルに静的boot ()メソッドを追加できることを既に知っているかもしれません。 これは、必要に応じて、たとえばモデルイベントへのスナップに使用できます。 たとえば、新しいユーザーが作成されるたびに電子メール通知を整理できます( 失敗例 )が、次のように説明できます。
class User extends Eloquent { public static function boot() { parent::boot(); static::created(function($user) { // Send a mailing… }); } }
しかし、もしあなたがこれを特色で置きたいとしたら?
このシナリオを検討してください。 さまざまなモデルで検索を整理する必要があります。 もちろん、 Eloquent \ Modelから継承して新しいSearchableModelクラスを作成できますが、特定のアプリケーションに縛られることなく、機能を他のプロジェクトに簡単に移植できるように書きたいと思います。 ここでの特徴は、簡単に再定義できる追加機能を取得して接続することにより、簡単に移植でき、比較的目立たないため、結局は優れています。
そこで、SearchableTraitを作成しました。
trait SearchableTrait { public function search($query) { // ... } }
簡単に言えば、 $ model-> search( 'query')メソッドを呼び出します。このメソッドは、クエリ条件に一致するモデルを返します。
それでも、データベースを直接検索する代わりに、サードパーティのアプリケーション検索( 興味がある場合は elasticsearch )を使用し、独自のインデックスを使用して、各行のインデックスを手動で調整する必要があります。
しかし、このコードをどこに貼り付けますか?
モデルのboot()メソッドに入れることもできますが、そこで上書きされる可能性があるため、検索が中断され、再利用される可能性がなくなります。
TL; DR
Laravelの連中は、Eloquentモデルのように、特別なメソッドを定義することで、形質をロードする方法を明示的に提供しました。例えば:
trait SearchableTrait { public function search($query) { // ... } public static function bootSearchableTrait() { static::created(function($item){ // Index the item }); } }
したがって、少し古典的なマジックEloquentがあります。 boot [ NameOfTrait]の原則によって呼び出されるトレイに静的メソッドがある場合、モデルの静的boot ()メソッドと同じ方法で実行されます 。 モデルのイベントを登録するのに便利な場所です。
Laravelドキュメントの例では、グローバルスコープを登録するときにこのトリックを実装して、実行中のすべてのリクエストをインターセプトし、モデルをソフトに削除します。
もちろん、この機能に加えて、同じ結果を達成するための他の良い方法がありますが、必要に応じてそれらを使用するために、あなたの武器庫で不十分に文書化された微妙さを保つことは常に良いことです。