Laravel 以干净的方式排除足智多谋的功能
Laravel excluding resourceful functions in a clean way
目前我的 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']);
您可以编写自己的 class 来扩展 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);
}
}
}
之后您需要像这样在您的服务提供商中绑定您的 class:
public function register()
{
$this->app->bind('Illuminate\Routing\Route', 'App\Extends\Route');
}
然后在 web.php 中调用 resources
像这样:
Route::resources([
'campaigns' => 'CampaignController',
'users' => 'UserController',
'models' => 'ModelController',
'trims' => 'TrimController'
], ['show']);
[编辑 1]
来自laravel.com/docs/5.8/controllers#resource-controllers
You may register many resource controllers at once by passing an array to the resources method:
Route::resources([
'photos' => 'PhotoController',
'posts' => 'PostController'
]);
但我不知道你是否可以这样调用->except(['show'])
Route::resources([])->except(['show'])
如果你谈论可能性,那么是的,就像上面提到的答案一样,但默认情况下你不能
看看这个文件,
/vendor/laravel/framework/src/Illuminate/Support/Facades/Route.php
* @method static \Illuminate\Routing\PendingResourceRegistration resource(string $name, string $controller, array $options = [])
* @method static void resources(array $resources)
这个问题已经很老了,但我遇到了同样的问题并以这种方式解决了它:
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
不可链接,因为它 returns void
。但是您仍然可以将选项传递给 resources
.
的第二个参数
这是“Larawel-way”,您没有覆盖任何供应商代码。
挖掘 here 以获得更多信息,它是如何工作的。
请注意,如果您想排除 show
方法,但尝试在浏览器中访问 /users/{user}
(HTTP GET
),路由器将抛出 The GET method is not supported for this route. Supported methods: PUT, PATCH, DELETE.
错误。发生这种情况是因为路由器仍然有这条路由,但是 PUT
、PATCH
和 DELETE
。然后你的应用程序崩溃了。
所以,如果有人不小心进入“显示”页面,您可能想要显示 HTTP 404。
我更喜欢添加fallback路线(这应该是你路线的最后一条路线!)
Route::fallback(function () {
abort(404);
});
目前我的 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']);
您可以编写自己的 class 来扩展 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);
}
}
}
之后您需要像这样在您的服务提供商中绑定您的 class:
public function register()
{
$this->app->bind('Illuminate\Routing\Route', 'App\Extends\Route');
}
然后在 web.php 中调用 resources
像这样:
Route::resources([
'campaigns' => 'CampaignController',
'users' => 'UserController',
'models' => 'ModelController',
'trims' => 'TrimController'
], ['show']);
[编辑 1]
来自laravel.com/docs/5.8/controllers#resource-controllers
You may register many resource controllers at once by passing an array to the resources method:
Route::resources([
'photos' => 'PhotoController',
'posts' => 'PostController'
]);
但我不知道你是否可以这样调用->except(['show'])
Route::resources([])->except(['show'])
如果你谈论可能性,那么是的,就像上面提到的答案一样,但默认情况下你不能
看看这个文件,
/vendor/laravel/framework/src/Illuminate/Support/Facades/Route.php
* @method static \Illuminate\Routing\PendingResourceRegistration resource(string $name, string $controller, array $options = [])
* @method static void resources(array $resources)
这个问题已经很老了,但我遇到了同样的问题并以这种方式解决了它:
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
不可链接,因为它 returns void
。但是您仍然可以将选项传递给 resources
.
这是“Larawel-way”,您没有覆盖任何供应商代码。
挖掘 here 以获得更多信息,它是如何工作的。
请注意,如果您想排除 show
方法,但尝试在浏览器中访问 /users/{user}
(HTTP GET
),路由器将抛出 The GET method is not supported for this route. Supported methods: PUT, PATCH, DELETE.
错误。发生这种情况是因为路由器仍然有这条路由,但是 PUT
、PATCH
和 DELETE
。然后你的应用程序崩溃了。
所以,如果有人不小心进入“显示”页面,您可能想要显示 HTTP 404。 我更喜欢添加fallback路线(这应该是你路线的最后一条路线!)
Route::fallback(function () {
abort(404);
});