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::resource
和 Route::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 资源控制器 的行为与上图完全相同,但不注册 create
和 edit
路由。它旨在用于简化 RESTful API 中使用的映射路由 - 通常在 create
或 edit
方法中没有任何类型的数据。
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.edit
和 resource.create
通常用于 UI... 使用 HTML 表单呈现视图。这些表单将分别 PUT/POST 到 resource.update
和 resource.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