在laravel5.*中,session start被放到了web中間件中,如
<code> /** * The application's route middleware groups. * * @var array */ protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, //<--------- \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, ], 'api' => [ 'throttle:60,1', 'bindings', ], ];</code>
並且根據Route載入中間件的程式碼可以得知Controller是在被make之後才呼叫中間件
<code> /** * Get the middleware for the route's controller. * * @return array */ public function controllerMiddleware() { if (! $this->isControllerAction()) { return []; } return ControllerDispatcher::getMiddleware( $this->getController(), $this->getControllerMethod() ); }</code>
這個時候問題就來了,我有一個BaseController,在構造函數裡面會判斷用戶登錄狀態,如果已經登錄就獲取登錄用戶信息保存到$this->login_user_info中供子類調用,如果先make controller,session還沒有start,因此在建構函式中是無法取得到登入使用者的session_id,部分程式碼如下
<code>/** * 控制层公有方法集合 * Class BaseController */ abstract class BaseController extends Controller { use AuthorizesRequests, DispatchesJobs, ValidatesRequests; public $login_user_info; public $login_subuser_info; public function __construct() { $this->userModel = app(UserModel::class); if (session()->get('user_id')) { $this->login_user_info = $this->userModel->getLoginUser(); //设置模板全局变量 view()->share(['login_user_info' => $this->login_user_info]); } }</code>
我測試過在middleware中是可以得到session,因為這個時候已經執行了StartSession中間件程式碼,至於我為什麼要這麼做就說來話長,我的專案是一個老專案切換框架到laravel,所以為了最大限度的保持原有邏輯,並且還有一些奇奇怪怪的寫法,沒有採用Auth,這些暫且不論,有沒有辦法可以在構造函數中得到session,求各位大神幫忙,謝謝