【问题标题】:Orchestra Testbench current route always return nullOrchestra Testbench 当前路由总是返回 null
【发布时间】:2018-06-13 00:47:00
【问题描述】:

我正在开发一个 Laravel 包,当我在我的 Laravel 项目中使用它时它正在工作,但是当我想用 Orchestra Testbench 测试它时,我总是在中间件中得到当前路由 null。

Github 上的测试目录:https://github.com/yoeunes/larafast/tree/master/tests

基础测试用例:

class TestCase extends Orchestra\Testbench\TestCase
{
    protected function getEnvironmentSetUp($app)
    {
        $kernel = app('Illuminate\Contracts\Http\Kernel');

        $kernel->pushMiddleware(\Illuminate\Session\Middleware\StartSession::class);
        $kernel->pushMiddleware(\Yoeunes\Larafast\Middlewares\BlacklistRoutes::class);
    }
}

WebControllerTest:

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');
    }

    /** @test */
    public function it_show_create_page()
    {
        /** @var TestResponse $response */
        $response = $this->call('get', '/lessons/create');
        dd($response);
        $response->assertSuccessful();
        $response->assertSee('<title>lessons create |  Larafast</title>');
        $response->assertSee('<i class="fa fa-plus-circle"></i> lessons create');
        $response->assertSee('<form method="POST" action="http://localhost/lessons" accept-charset="UTF-8" enctype="multipart/form-data">');
    }
}

BlacklistRoutes 中间件:

class BlacklistRoutes
{
    public function handle($request, Closure $next)
    {
        dd(app('router')->getCurrentRoute()); // always get null
        if (null !== ($route = app('router')->getCurrentRoute())
            && is_a($controller = $route->getController(), Controller::class)
            && in_array($route->getActionMethod(), $controller->getBlacklist(), true)) {
            throw new BlacklistRouteException();
        }

        return $next($request);
    }
}

【问题讨论】:

    标签: php laravel laravel-5 phpunit


    【解决方案1】:

    根据 Orchestra Testbench Github 存储库:

    AFAIK 全局中间件在路由解析之前解析, 因此 getCurrentRoute() 应该还不可用。

    所以为了解决我的问题,我可以从控制器构造函数中访问当前路由,如下所示:

    public function __construct() 
    { 
        $this->middleware(function ($request, Closure $next) { 
            if (null !== ($route = app('router')->getCurrentRoute())
                && is_a($controller = $route->getController(), Controller::class)
                && in_array($route->getActionMethod(), $controller->getBlacklist(), true)) {
    
                throw new BlacklistRouteException();
            }
        }); 
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      相关资源
      最近更新 更多