Laravel以干净的方式排除了足智多谋的功能



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

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

我不禁纳闷。我不能向Route::resources函数添加一些东西以使其以这种方式运行吗?这是因为他们都有一个共同点。他们except()show()方法。

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

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

您可以编写自己的类来扩展IlluminateRoutingRoute并像这样实现您的resources方法:

namespace AppExtends;
class Route extends IlluminateRoutingRoute {
public function resources($routes, array $excepts) {
foreach ($routes as $key => $value){
$this->resource($key, $value)->except($excepts);
}
}
}

之后,您需要像这样在服务提供商中绑定您的类:

public function register()
{
$this->app->bind('IlluminateRoutingRoute', 'App\Extends\Route');
}

并在 Web 中调用resources.php如下所示:

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

[编辑1]

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

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

Route::resources([
'photos' => 'PhotoController',
'posts' => 'PostController'
]);

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

Route::resources([])->except(['show'])

这个问题已经很老了,但我只是面对同样的问题并以这种方式解决了它:

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

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

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

在这里挖掘以获取更多信息,它是如何工作的。


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

因此,如果有人不小心转到"显示"页面,也许您想要显示HTTP 404。 我更喜欢添加后备路由(这应该是您路由的最后一条路由!

Route::fallback(function () {
abort(404);
});

如果你谈论可能性,那么是的,正如上面提到的答案所提到的,这是可能的,但默认情况下你不能

看看这个文件,

/

vendor/laravel/framework/src/Illuminate/Support/Facades/Route.php

* @method static IlluminateRoutingPendingResourceRegistration resource(string $name, string $controller, array $options = [])
* @method static void resources(array $resources)

最新更新