Orchestra Testbench中间件获取当前路由始终返回null问题
解决Orchestra Testbench测试中中间件无法获取当前路由的问题
你遇到的问题核心是中间件执行时机不匹配——在测试代码里你把BlacklistRoutes注册成了全局中间件,但Laravel的全局中间件是在路由匹配流程之前运行的,此时当前路由还未被解析,所以getCurrentRoute()自然返回null。而在实际Laravel项目中,你应该是把这个中间件配置成了路由中间件或者加入了web中间件组,这些中间件是在路由匹配完成后执行的,因此能正常拿到路由信息。
下面是具体的解决方案:
1. 调整中间件的注册方式(测试基类)
在你的TestCase中,不要用pushMiddleware把中间件加到全局栈,而是注册为路由中间件,或者同步项目中的web中间件组配置:
class TestCase extends Orchestra\Testbench\TestCase { protected function getEnvironmentSetUp($app) { // 注册路由中间件别名,和你实际项目中的配置保持一致 $app['router']->aliasMiddleware('larafast.blacklist', \Yoeunes\Larafast\Middlewares\BlacklistRoutes::class); // 如果你在项目中是把中间件加入web中间件组,测试中也同步这个配置 $existingWebMiddleware = $app['router']->getMiddlewareGroups()['web']; $app['router']->middlewareGroup('web', array_merge($existingWebMiddleware, ['larafast.blacklist'])); } }
2. (可选)在路由上显式绑定中间件
如果没有加入web组,在测试注册路由时直接指定使用该中间件:
class WebControllerTest extends TestCase { public function setUp() { parent::setUp(); /** @var \Illuminate\Routing\Router $router */ $router = $this->app['router']; $router->resource('lessons', 'Yoeunes\Larafast\Tests\Stubs\Controllers\Web\LessonController') ->middleware('larafast.blacklist'); } // ... 你的测试方法 }
3. 优化中间件内的路由获取方式
建议在中间件中通过$request->route()来获取当前路由,语义更清晰,和app('router')->getCurrentRoute()效果完全一致:
class BlacklistRoutes { public function handle($request, Closure $next) { if (null !== ($route = $request->route()) && is_a($controller = $route->getController(), Controller::class) && in_array($route->getActionMethod(), $controller->getBlacklist(), true) ) { throw new BlacklistRouteException(); } return $next($request); } }
这样调整后,测试中的中间件会在路由匹配完成后执行,就能正常获取到当前路由对象了。
内容的提问来源于stack exchange,提问作者yoeunes
相关产品推荐
相关产品推荐

