基于我上面的评论建立了一个注册自定义路由器,如果中间件被禁用,它总是会将SubstituteBindings
添加到中间件列表中。您可以通过注册自定义RoutingServiceProvider
并注册您自己的Router
课程来实现。不幸的是,由于该路线在应用程序引导过程中很早就已经创建,因此您还需要创建一个自定义App类并在bootstrap/app.php
中使用该类。
RoutingServiceProvider
<?php namespace App\Extensions\Providers;
use Illuminate\Routing\RoutingServiceProvider as IlluminateRoutingServiceProvider;
use App\Extensions\ExtendedRouter;
class RoutingServiceProvider extends IlluminateRoutingServiceProvider
{
protected function registerRouter()
{
$this->app['router'] = $this->app->share(function ($app) {
return new ExtendedRouter($app['events'], $app);
});
}
}
定制路由器
这增加了中间件,它只是扩展了默认的路由器,但覆盖runRouteWithinStack
方法,而不是如果$this->container->make('middleware.disable')
是真的返回一个空数组它会返回一个包含SubstituteBindings
类的数组。
<?php namespace App\Extensions;
use Illuminate\Routing\Router;
use Illuminate\Routing\Route;
use Illuminate\Routing\Pipeline;
use Illuminate\Http\Request;
class ExtendedRouter extends Router {
protected function runRouteWithinStack(Route $route, Request $request)
{
$shouldSkipMiddleware = $this->container->bound('middleware.disable') &&
$this->container->make('middleware.disable') === true;
// Make sure SubstituteBindings is always used as middleware
$middleware = $shouldSkipMiddleware ? [
\Illuminate\Routing\Middleware\SubstituteBindings::class
] : $this->gatherRouteMiddleware($route);
return (new Pipeline($this->container))
->send($request)
->through($middleware)
->then(function ($request) use ($route) {
return $this->prepareResponse(
$request, $route->run($request)
);
});
}
}
自定义应用类
<?php namespace App;
use App\Extensions\Providers\RoutingServiceProvider;
class MyCustomApp extends Application
{
protected function registerBaseServiceProviders()
{
parent::registerBaseServiceProviders();
$this->register(new RoutingServiceProvider($this));
}
使用自定义应用程序的类
在bootstrap/app.php
变化的线,其中该应用被实例化到:
$app = new App\MyCustomApp(
realpath(__DIR__.'/../')
);
-
警告!我还没有完全测试这个,我的应用程序加载和我的测试通过,但可能有问题,我还没有发现。这也相当脆弱,因为如果Laravel基类Router
类更改,您可能会发现事情在未来升级时随机突破。
-
您可能还需要重构自定义路由器这使中间件的名单总是包含SubstituteBindings
类,所以没有那么多的行为差异,如果中间件被禁用。
我也看到这一点,它基本上使测试不可能,因为我的应用程序严重依赖绑定。 Laravel GitHub存储库中存在一个问题(https:// github。com/laravel/framework/issues/15163),但似乎很快就没有讨论就把它当作一个非问题。我能想到的唯一'修复'是找到一种不使用'withoutMiddleware'或注册一个总是使用'SubstituteBindings'中间件的自定义路由器的方法。 – andyberry88