[Laravel 5] 筆記14 Route Model Binding

2015-03-16

https://laracasts.com/series/laravel-5-fundamentals/episodes/18

Route Model Binding
可以將接到的參數經由設定好的規則 給出一個 model 的 instance
例如由網址接收到了一個 user_id 或是 article_id
可以給出一個 id = user_id 的 User instance
或是 id = article_id 的 Article instance
 
這個 Binding 的設定要加在 RouteServiceProvider.php
▼ app/Providers/RouteServiceProvider.php

	public function boot(Router $router)
	{
		parent::boot($router);

		// 第一個參數是 route 的 wildcard key 
		// 第二個參數是要指定到的 model
		$router->model('articles', 'App\Article');

		// 如果不是單純要獲得一個 Model instance 也可以自己寫處理邏輯
		$router->bind('articles', function($id){
    			return \App\Article::published()->findOrFail($id);
		});

	}

 
wildcard key 就是在 Routes.php 裡面設定的 articles/{這個}
▼ app/Http/routes.php

// 這邊的 aaa 即為設定 model binding 需要的值
Route::get('articles/{aaa}', 'HomeController@index');

// 前面使用 articles 是因為這邊使用 resource 後 自動生成的 wildcard key 就是 articles
// 可以使用 artisan 查詢 php artisan route:list 看目前有什麼 wildcard key (也就是 { } 包起來的值)
Route::resource('articles','ArticlesController');

 
前面 RouteServiceProvider.php 設定完之後
就可以修改 Controller 的東西
▼ app/Http/Controllers/ArticlesController.php

    public function show(Article $article)
    {
        // 原本參數是 $id 還要再找這個 $id 的 article 
        // 現在參數直接就是這個 $id 的 Article instance
        // 下面這行就可以省略了
        //$article = Article::find($id);
        return view("articles.show",compact('article'));
    }

    public function edit(Article $article)
    {
        //$article = Article::findOrFail($id);
        return view('articles.edit', compact('article'));
        
    }

    public function update(Article $article, ArticleRequest $request)
    {
        //$article = Article::findOrFail($id);
        $article->update($request->all());
        return redirect('articles');
    }