Laravel - Route::resource vs Route::controller
Laravel - Route::resource vs Route::controller
我在Laravel官网、Stack Overflow和Google上阅读了相关文档,但仍然不理解Route::resource
和Route::controller
之间的区别。有人在回答中说,Route::resource
用于crud,但是我们使用Route::controller
也能完成相同的操作,并且可以指定需要的操作。它们看起来像兄弟一样:
Route::controller('post','PostController'); Route::resource('post','PostController');
如何选择使用哪个?什么是良好的实践?
admin 更改状态以发布 2023年5月24日
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中使用的路由 - 在这些API中,通常不会在create
和edit
方法中存在任何类型的数据。
Route::apiResource('users', 'UsersController');
隐式控制器
隐式控制器更加灵活。根据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资源控制器和显式路由相结合的方式。