Laravel5.1からルーティングモデルバインディング機能が提供されていましたが、Laravel5.2ではこの機能の実装がより簡単になりました。
通常、次の方法で URL ルーティングでモデルをバインドします:
Route::group(['middleware' => ['web']], function () { Route::get('/user/{id}',function($id){ $user = \App\User::findOrFail($id); dd($user); });});
通常はこの方法で実装しますが、findOrFail 行を削除して直接$user インスタンスを取得した方が良いのではないでしょうか?実際、これは Laravel で実現できます。次のコード行をルーティング サービス プロバイダー RouteServiceProvider のブート メソッドに追加します。
public function boot(Router $router){ $router->model('user',User::class); parent::boot($router);}
これは、ルートにパラメータ user が含まれる場合は常に、その ID 値がそれぞれ AppUser インスタンスに対応することを意味します。このメカニズムにより、上記のコードを次のように書き換えることができます:
Route::group(['middleware' => ['web']], function () { Route::get('/user/{user}',function($user){ dd($user); });});
Laravel 5.2 では、ルーティング モデル バインディングを使用する方が簡単です。これは、ルーティング クロージャで行う必要があるだけです。パッケージ (またはコントローラー メソッド) で type パラメーターを宣言し、そのパラメーターをルーティング パラメーターと一貫性を保つだけで、パラメーターは自動的にルーティング モデル バインディングとして扱われます (宣言するために RouteServiceProvider でモデル メソッドを呼び出す必要はありません)バインディング) 関係):
Route::group(['middleware' => ['web']], function () { Route::get('/user/{user}',function(\App\User $user){ dd($user); });});
印刷結果は以前とまったく同じです。
3.1 カスタム ルーティング モデル バインディング ロジック
必要なインスタンスを返すようにルーティング モデル バインディング ロジックをカスタマイズしたい場合は、代わりにクロージャーを渡すことができます。明示的バインディングの 2 番目のパラメーター (暗黙的モデル バインディングと比較して、明示的バインディングと呼ばれる RouteServiceProvider のブート メソッドでバインディング関係を定義する必要があります):
public function boot(Router $router){ $router->bind('user',function($value){ return User::where('name',$value)->where('status',1)->first(); }); parent::boot($router);}
3.2 カスタム ルーティング モデル バインディング例外
例外をカスタマイズすることもできます3 番目のパラメータとしてクロージャを渡すことにより、ルーティング モデル バインディングによってスローされます (たとえば、対応するモデル インスタンスが見つからない場合):
public function boot(Router $router){ $router->bind('user',User::class,function(){ throw new NotFoundHttpException; }); parent::boot($router);}
3.3 Eloquent モデルの「ルーティング キー」を変更します
Default この場合、Laravel は次を使用しますEloquent モデル マッチングの URL フラグメントの id フィールドですが、上記のカスタム ルーティング モデル バインディングと同様に、このフィールドをカスタマイズしたい場合、どのように実装すればよいでしょうか?
Eloquent は IlluminateContractsRoutingUrlRoutable インターフェイスを実装します。つまり、Eloquent オブジェクトには getRouteKeyName() メソッドがあり、モデル インスタンスに一致するように URL で使用するフィールドを定義できます。デフォルトは id です。雄弁なモデル:
class User extends Model { public function getRouteKeyName() { return 'name'; }}
明示的または暗黙的なルーティング モデル バインディングを使用できるようになり、URL フラグメントの一致フィールドをカスタマイズできるようになりました。