2017-03-07 45 views
0

我有一個簡單的中間件,用於檢查用戶會話中是否有密鑰。在laravel的自定義中間件中使用會話

<?php 

namespace App\Http\Middleware; 

use Closure; 

class CustomAuth 
{ 
    public function handle($request, Closure $next) 
    { 
     if($request->session()->has('uid')){ 
      return $next($request); 
     } 
     else{ 
      return view('unauth'); 
     } 
    } 
} 

問題是我總是得到「Session store not set on request。」。錯誤。下面是我的路線:

Route::get('home', function() { 
     return view('home'); 
    })->middleware('web', 'CustomAuth'); 

我在變量$中間件

protected $middleware = [ 
     \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, 
     \App\Http\Middleware\CustomAuth::class 
    ]; 

我也試圖改變我的路線,這在添加應用程序\ HTTP協議中間件\ Kernel.php:

Route::group(['middleware' => ['web']], function() { 
    Route::get('home', function() { 
     return view('home'); 
    })->middleware('CustomAuth'); 
}); 

但這沒有奏效。任何想法如何確保會話已開始,或在中間件被調用之前啓動?我正在使用Laravel 5.3

+0

將您的中間件移到'web'中間件組中,並在'SessionStart'中間件之後移動。 – apokryfos

+0

雖然這是工作,它將它附加到所有請求,我設法我 –

+0

它的方式之前,它也建立了所有請求,所以我認爲這就是你需要的。如果你不想這麼做,那麼按名稱在'$ routeMiddleware'中聲明它並正常使用它(在這種情況下,web中間件已經運行) – apokryfos

回答

0

L5中間件由3個「類型」組成。

配置在Kernel.php文件的HTTP請求(通常爲App\Http\Kernel發現,有全球中間件將所有請求運行,並在$middleware聲明,還有的航線組中間件將針對給定路由組中的所有請求運行在$middlewareGroups聲明,默認情況下在web.php聲明的所有路線都被認爲是web路由,以便所有的Web中間件應用。

第三類型的路由中間件。這些形式"middlewareName" => Middleware::class$routeMiddleware數組中聲明的,可用於任何路線,例如

Route::get("/route", function() { /* route body */ })->middleware("middlewareName"); 

這些按順序運行全局>組>路由中間件,SessionStart中間件作爲組中間件的一部分運行。任何其他需要訪問會話的中間件都需要放置在中間件後面。