2015-03-31 134 views
5

在我的应用程序中,我实施了OAuth2服务器(oauth2-server-laravel)和定制的认证包(Sentinel by Cartalyst)。暂时禁用/绕过中间件

在我的routes.php文件:

Route::group(['before' => 'oauth'], function() 
{ 
    // ... some routes here 
} 

所以要求必须提供授权头或应用程序退出与OAuthException。

现在我想单元测试我的控制器。所以我必须为每个测试使用OAuth会话和访问令牌来为我的数据库创建种子。 然后覆盖call()-方法TestCase,并使用承载令牌设置HTTP授权标头。

有没有一种方法来禁用或绕过中间件(在我的情况下只是为了单元测试)?

在Laravel 4中,它们被称为路由过滤器,无论如何它们在测试环境中都被禁用。您也可以使用Route::enableFilters()手动启用/禁用它们。

+0

我也想知道这个答案,迄今为止我的阅读是,无法在Laravel 5中禁用Laravel 5中的路由过滤器的方式禁用Laravel 5中的中间件。但是我很热衷于被证明是错误的。 – delatbabel 2015-04-07 10:13:16

回答

5

5.1昨天disableMiddleware()方法添加到TestCase类,现在不正是我想要的。

问题解决。 :)

+1

因此,只需在您的测试用例类中放入'use WithoutMiddleware;' – surfer190 2015-12-18 16:16:39

+0

对此的改进已合并到允许禁用特定中间件集的框架中。请参阅https://github.com/laravel/framework/pull/18673 – meysam 2017-04-28 09:48:18

2

我能想出的唯一答案就是在实际的中间件本身中设置一个旁路。例如:

public function handle($request, Closure $next) 
{ 
    // Don't validate authentication when testing. 
    if (env('APP_ENV') === 'testing') { 
     return $next($request); 
    } 
    // ... continue on to process the request 
} 

我不喜欢做中间件依赖于应用环境的想法,但我看不到任何其他选项。