Laravel - Route::resource 与 Route::controller

Posted

技术标签:

【中文标题】Laravel - Route::resource 与 Route::controller【英文标题】:Laravel - Route::resource vs Route::controller 【发布时间】:2014-06-23 17:26:10 【问题描述】:

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

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

他们看起来像兄弟姐妹:

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

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

【问题讨论】:

Laravel 5.2 用户的注意事项,同时隐式控制器已被弃用。 【参考方案1】:

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 中使用的映射路由 - 通常在 createedit 方法中没有任何类型的数据。

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

RESTful Resource Controller documentation

隐式控制器

隐式控制器更灵活。根据 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 Controller documentation

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

【讨论】:

如果我们使用多个资源路由(可能是索引、显示),为什么不使用静态路由 Route::get(...)?我认为这并不比使用 array('only' => array('index', 'show') 更好。当我们请求'user/123'之类的东西时,RESTFull 控制器使用什么方法,getIndex() 适用于'user/' 但使用 user/123 时出现错误 NotFoundHttpException(尝试了不同的名称 getView 和其他名称,仅在声明为 Controller@getView 时有效)? 有人可以澄清“resource.edit”的用途吗?它是一种 GET 方法,所以我假设它应该是关于资源的完整信息,而不仅仅是通过“resource.show”获得的有限信息? @Anthony - resource.edit 是显示一个编辑视图,基本上是编辑现有资源的表单。 @fungku 这很有趣.. 你是说 resource.edit 实际上会返回 html 而不是 JSON? @Anthony 一般来说,(据我所知)是的。 resource.editresource.create 通常用于 UI... 使用 HTML 表单呈现视图。这些表单将分别 PUT/POST 到 resource.updateresource.store。如果您不这样做,那么您可以忽略它们并摆脱控制器中的 edit() 和 create() 方法。【参考方案2】:

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

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

Laravel documentation 关于这个。

【讨论】:

以上是关于Laravel - Route::resource 与 Route::controller的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 4 - Route::resource 与 Route::controller。使用哪个?

LARAVEL - 使用 Route::resource 生成路由时无法使用销毁路由

Laravel 使用 Route::resource 生成路由需要添加前缀 /admin/

Laravel:Route::resource() GET & POST 工作,但 PUT & DELETE 抛出 MethodNotAllowedHttpException

Laravel 本地化与 Route Resource 参数混淆

Laravel 内置 Route::resource 可以直接创建 restful 风格的接口