Laravel-Route :: resource vs Route :: controller


138

我阅读文档的Laravel网站,堆栈溢出,并且谷歌,但还是不明白之间的差别Route::resourceRoute::controller

答案之一说Route :: resource是为生的。但是,使用Route :: controller可以完成与Route :: resource相同的操作,并且只能指定所需的操作。

他们看起来像兄弟姐妹:

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

我们如何选择使用什么?什么是好习惯?


12
仅为Laravel 5.2用户提供说明,同时不赞成使用隐式控制器。
罗伊

Answers:


282

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|PATCH     /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资源控制器文档


隐式控制器

隐式控制器是更灵活的。您将基于HTTP请求类型和名称被路由到控制器方法。但是,您没有为您定义路线名称,它将捕获同一路线的所有子文件夹。

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

会导致您使用一种RESTful命名方案来设置控制器:

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控制器,因为它们可能很杂乱,不提供名称,并且在使用时会造成混淆php artisan routes。我通常将RESTful资源控制器与显式路由结合使用。


1
如果我们使用多个资源路由(也许是索引,请显示),为什么不使用静态路由Route :: get(...)?我认为最好不比使用array('only'=> array('index','show')。而且当我们请求诸如'user / 123'之类的RESTFull控制器使用哪种方法时,getIndex()适用于'用户/',但使用用户/ 123,我得到错误NotFoundHttpException(尝试使用不同的名称getView和其他名称,仅在声明为Controller @ getView时才起作用)吗?
Sonique 2014年

有人可以澄清“ resource.edit”的用途吗?这是一个GET方法,因此我假设它应该是在资源上完整的完整信息,而不是仅通过'resource.show'来提供有限的信息?
安东尼

1
@Anthony- resource.edit将显示一个编辑视图,基本上是用于编辑现有资源的表单。
ryanwinchester

@fungku很有意思..所以您是说resource.edit实际上会返回HTML而不是JSON吗?
安东尼

2
@Anthony通常,(据我所知)是的。resource.editresource.create一般的UI渲染... HTML表单视图。这些表格将分别放在resource.updateresource.store上。如果您不这样做,则可以忽略它们并在控制器中摆脱edit()和create()方法。
ryanwinchester 2014年

3

对于路径控制器方法,我们只需要定义一条路径。在get或post方法中,我们必须分别定义路线。

资源方法用于创建多个路由以处理各种Restful动作。

这里是Laravel 文档

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.