161

我阅读了 Laravel 网站、Stack Overflow 和 Google 上的文档,但仍然不明白 和 之间的Route::resource区别Route::controller

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

他们看起来像兄弟姐妹:

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

我们如何选择使用什么?什么是好的做法?

4

2 回答 2

335

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']
]);

API 资源控制器

Laravel 5.5 添加了另一种处理资源控制器路由的方法。API 资源控制器的行为与上图完全一样,但不注册createedit路由。它旨在用于简化在 RESTful API 中使用的映射路由 - 在这种情况下,您通常没有任何类型的数据位于createnoredit方法中。

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

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'
    }

}

隐式控制器文档


根据您的喜好使用您需要的东西是一种很好的做法。我个人不喜欢隐式控制器,因为它们可能很乱,不提供名称并且在使用时可能会令人困惑php artisan routes。我通常将RESTful 资源控制器与显式路由结合使用。

于 2014-05-07T00:23:28.893 回答
3

对于路由控制器方法,我们只需要定义一个路由。在 get 或 post 方法中,我们必须单独定义路由。

而resources方法用于创建多个路由来处理各种Restful动作。

这里是关于这个的 Laravel文档

于 2014-12-18T16:59:31.580 回答