2015-03-31 137 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 
} 

我不喜歡做中間件依賴於應用環境的想法,但我看不到任何其他選項。