ホームページ  >  記事  >  バックエンド開発  >  Laravel 5.2新機能シリーズ - 暗黙的ルーティングモデルバインディング機能の実装

Laravel 5.2新機能シリーズ - 暗黙的ルーティングモデルバインディング機能の実装

WBOY
WBOYオリジナル
2016-06-23 13:15:351037ブラウズ

Laravel5.1からルーティングモデルバインディング機能が提供されていましたが、Laravel5.2ではこの機能の実装がより簡単になりました。

1. ルーティング モデル バインディングの基本的な使用法

通常、次の方法で 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);    });});

2. 暗黙的なルーティング モデル バインディング

Laravel 5.2 では、ルーティング モデル バインディングを使用する方が簡単です。これは、ルーティング クロージャで行う必要があるだけです。パッケージ (またはコントローラー メソッド) で type パラメーターを宣言し、そのパラメーターをルーティング パラメーターと一貫性を保つだけで、パラメーターは自動的にルーティング モデル バインディングとして扱われます (宣言するために RouteServiceProvider でモデル メソッドを呼び出す必要はありません)バインディング) 関係):

Route::group(['middleware' => ['web']], function () {    Route::get('/user/{user}',function(\App\User $user){        dd($user);    });});

印刷結果は以前とまったく同じです。

3. ルーティング モデル バインディングのいくつかの機能

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 は IlluminateContractsRou​​tingUrlRoutable インターフェイスを実装します。つまり、Eloquent オブジェクトには getRouteKeyName() メソッドがあり、モデル インスタンスに一致するように URL で使用するフィールドを定義できます。デフォルトは id です。雄弁なモデル:

class User extends Model {    public function getRouteKeyName()    {        return 'name';    }}

明示的または暗黙的なルーティング モデル バインディングを使用できるようになり、URL フラグメントの一致フィールドをカスタマイズできるようになりました。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。