2014-05-07 80 views
0

路線通2個從路由參數到Laravel控制器4

Route::get('/site/{site_name_en}/{id}', array(
    'as' => 'profile-site', 
    'uses' => '[email protected]' 
)); 

控制器

class ProfileController extends BaseController{ 

    public function site($id, $site_name_en){ 
     $site = Site::where('id', '=', $id) 
      ->where('site_name_en', '=', $site_name_en); 

     if($site->count()){ 
      $site = $site->first(); 
      return View::make('profile.site') 
       ->with('site', $site); 
     } 
     return App::abort(404); 
    } 
} 

我想要實現的是:當我訪問以下網址www.domain.com/site/abc/123456 ,它將根據參數顯示正確的頁面。 where子句是否正確? (因爲我無法檢索值)

回答

3

您的路線

Route::get('/site/{site_name_en}/{id}', 

說,第一個參數是網站的名稱,第二個ID,但你的控制器功能具有交換的參數。你應該把它叫做:

public function site($site_name_en, $id){ 
    // rest of code 
} 

參數在它們被路由中定義的順序自動傳下來的,而不是由變量名稱(IIRC)的認可。

至於你的函數的其餘部分我真的不能告訴你正在做的正確與否,但我可以建議是:或者

$site = Site::where('id', '=', $id) 
      ->where('site_name_en', '=', $site_name_en) 
      ->first(); 
if($site){ 
    return View::make('profile.site'); 
} 
return App::abort(404); 

,你可以使用firstOrFail(),它拋出一個ModelNotFoundException如果記錄沒有被發現,你可以用App::error()爲例(手冊中概述了一個實現)

+0

我確定Damien Pirsy答案會解決問題,但我建議添加一個路由約束,爲了安全。 http://laravel.com/docs/routing#route-parameters –

+0

謝謝Damien。 – spacemonkey