我阅读了 Laravel 网站、Stack Overflow 和 Google 上的文档,但仍然不明白 Route::resource
和 Route::controller
之间的区别。
答案之一说 Route::resource 是为了 crud。但是,使用 Route::controller 我们可以完成与使用 Route::resource 相同的事情,并且我们可以只指定所需的操作。
他们看起来像兄弟姐妹:
Route::controller('post','PostController');
Route::resource('post','PostController');
我们如何选择使用什么?什么是好的做法?
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 资源控制器 与显式路由结合使用。
对于路由控制器方法,我们只需要定义一个路由。在 get 或 post 方法中,我们必须单独定义路由。
而resources方法用于创建多个路由来处理各种Restful动作。
这里是关于这个的 Laravel documentation。
不定期副业成功案例分享
resource.edit
是显示一个编辑视图,基本上是用于编辑现有资源的表单。resource.edit
和resource.create
通常用于 UI...用 HTML 表单呈现视图。这些表单将分别 PUT/POST 到resource.update
和resource.store
。如果您不这样做,那么您可以忽略它们并摆脱控制器中的 edit() 和 create() 方法。