ChatGPT解决这个技术问题 Extra ChatGPT

Laravel - Route::resource 与 Route::controller

我阅读了 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 用户的注意事项,同时隐式控制器已被弃用。

K
Karol Sobański

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() 方法。
A
Ahmad Sharif

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

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

这里是关于这个的 Laravel documentation