2014-05-06 95 views
69

我閱讀Laravel網站上的文檔,Stack Overflow和Google,但仍不明白Route::resourceRoute::controller之間的差異。Laravel - 路線::資源vs路線::控制器

路線::資源的答案之一是crud。但是,通過Route :: controller,我們可以完成與Route :: resource相同的任務,並且只能指定所需的操作。

它們看起來像兄弟姐妹:

Route::controller('post','PostController'); 
Route::resource('post','PostController'); 

如何,我們可以選擇用什麼?什麼是好的做法?

+10

只是對Laravel 5.2用戶的說明,同時隱含的控制器已被棄用。 – Roy

+0

路由::控制器加回代碼:https://github.com/shrimpwagon/laravel-route-controller – shrimpwagon

回答

139

的RESTful資源控制器

一個的RESTful資源控制器爲您設置了一些默認的路由,連名字他們。

Route::resource('users', 'UsersController'); 

給你這些命名路線:

Verb Path      Action Route Name 
GET  /users      index users.index 
GET  /users/create    create users.create 
POST /users      store users.store 
GET  /users/{user}    show users.show 
GET  /users/{user}/edit   edit users.edit 
PUT  /users/{user}    update users.update 
DELETE /users/{user}    destroy users.destroy 

而且你會設置你的控制器是這樣的(行動=方法)

class UsersController extends BaseController { 

    public function index() {} 

    public function show($id) {} 

    public function store() {} 

} 

您也可以選擇包括哪些行動或排除如下:

Route::resource('users', 'UsersController', [ 
    'only' => ['index', 'show'] 
]); 

Route::resource('monkeys', 'MonkeysController', [ 
    'except' => ['edit', 'create'] 
]); 

RESTful Resource Controller documentation


隱控制器

一種隱控制器更加靈活。您可以根據HTTP請求類型和名稱路由到您的控制器方法。但是,您沒有爲您定義路線名稱,它會捕獲相同路線的所有子文件夾。

Route::controller('users', 'UserController'); 

會導致您建立控制器帶有幾分REST風格的命名方案:

class UserController extends BaseController { 

    public function getIndex() 
    { 
     // GET request to index 
    } 

    public function getShow($id) 
    { 
     // get request to 'users/show/{id}' 
    } 

    public function postStore() 
    { 
     // POST request to 'users/store' 
    } 

} 

Implicit Controller documentation


它是使用你所需要的良好做法,根據您的偏好。我個人不喜歡隱式控制器,因爲它們可能會混亂,不提供名稱,並且在使用php artisan routes時可能會引起混淆。我通常使用RESTful資源控制器結合顯式路由。

+0

如果我們使用幾個資源路由(也許是索引,顯示)爲什麼不使用靜態路由Route :: get(。 ..)?我認爲使用數組('only'=> array('index','show'))並不比使用array('only'='array')更糟糕。當我們請求像'user/123'這樣的東西時,RESTFull控制器使用什麼方法,getIndex() 'user /'但用戶/ 123我得到錯誤NotFoundHttpException(嘗試不同的名稱getView和其他人,只有在聲明爲Controller @ getView時纔有效)? – Sonique

+0

有人可以澄清'resource.edit'的用途是什麼?它是一種GET方法,所以我假設它應該是一個資源完整的全部信息,而不是通過'resource.show'來限制信息? – Anthony

+0

@Anthony - 'resource.edit'是顯示一個編輯視圖,基本上是編輯一個現有的資源 – ryanwinchester

0

對於路由控制器方法,我們只能定義一條路由。在get或post方法中,我們必須單獨定義路由。

資源方法用於創建多個路線來處理各種Restful操作。

這裏的Laravel documentation關於這個。