Laravel 以干净的方式排除资源丰富的函数

Nie*_*man 4 php laravel laravel-6

目前我的文件中有这 4 条资源丰富的路线web.php

Route::resource('campaigns', 'CampaignController')->except(['show']);
Route::resource('users', 'UserController')->except(['show']);
Route::resource('models', 'ModelController')->except(['show']);
Route::resource('trims', 'TrimController')->except(['show']);
Run Code Online (Sandbox Code Playgroud)

我不禁想知道。我不能向该Route::resources函数添加一些内容以使其表现出这种方式吗?这是因为它们都有一个共同点。他们的except()方法show()

它想要有这样的东西。(这个例子不起作用,因为resources()没有except()方法。

Route::resources([
    'campaigns' => 'CampaignController',
    'users' => 'UserController',
    'models' => 'ModelController',
    'trims' => 'TrimController'
])->except(['show']);
Run Code Online (Sandbox Code Playgroud)

loi*_*pez 5

您可以编写自己的类来扩展Illuminate\Routing\Route和实现您的resources方法,如下所示:

namespace App\Extends;

class Route extends Illuminate\Routing\Route {

   public function resources($routes, array $excepts) {
     foreach ($routes as $key => $value){
         $this->resource($key, $value)->except($excepts);
     }
   }

}
Run Code Online (Sandbox Code Playgroud)

之后您需要将您的类绑定到您的服务提供者中,如下所示:

public function register()
{
    $this->app->bind('Illuminate\Routing\Route', 'App\\Extends\\Route');
}
Run Code Online (Sandbox Code Playgroud)

并像这样resources调用web.php :

Route::resources([
    'campaigns' => 'CampaignController',
    'users' => 'UserController',
    'models' => 'ModelController',
    'trims' => 'TrimController'
], ['show']);
Run Code Online (Sandbox Code Playgroud)

[编辑1]

来自laravel.com/docs/5.8/controllers#resource-controllers

您可以通过将数组传递给 resources 方法来一次注册多个资源控制器:

Route::resources([
    'photos' => 'PhotoController',
    'posts' => 'PostController'
]);
Run Code Online (Sandbox Code Playgroud)

但我不知道你是否可以->except(['show'])这样打电话

Route::resources([])->except(['show'])
Run Code Online (Sandbox Code Playgroud)


Rom*_*rik 5

这个问题已经很老了,但我刚刚遇到了同样的问题并以这种方式解决了它:

Route::resources([
    'campaigns' => 'CampaignController',
    'users' => 'UserController',
    'models' => 'ModelController',
    'trims' => 'TrimController'
], [
    'except' => ['show']
    // you can set here other options e.g. 'only', 'except', 'names', 'middleware'
]);
Run Code Online (Sandbox Code Playgroud)

根据源代码,方法resources不可链接,因为它返回void. 但您仍然可以将选项传递到 的第二个参数中resources

这是“Larawel-way”,您没有覆盖任何供应商代码。

在这里挖掘以获取更多信息及其工作原理。


请注意,如果您想排除show方法,但尝试在浏览器中访问/users/{user}(HTTP GET),路由器将抛出The GET method is not supported for this route. Supported methods: PUT, PATCH, DELETE.错误。发生这种情况是因为路由器仍然有这条路由,但是对于PUTPATCH、 和DELETE。然后你的应用程序崩溃了。

因此,如果有人不小心进入“显示”页面,您可能希望显示 HTTP 404。我更喜欢添加后备路线(这应该是您路线的最后一条路线!

Route::fallback(function () {
    abort(404);
});
Run Code Online (Sandbox Code Playgroud)