1. 程式人生 > >laravel建構函式和中介軟體執行順序問題

laravel建構函式和中介軟體執行順序問題

今天想重構下程式碼結構:

	BaseController.php 放置公共的中介軟體
	class BaseController
	{
		public function __construct(){
			$this->middleware('login');	
		}
	}

	IndexController.php 繼承 BaseController
	class IndexController extends BaseController
	{
		$user;	// 儲存登入使用者例項
		public function __construct(){
			parent::__constuct();
			$this->user = Auth::user();
		}
	}

	--------------------

	如上程式碼,一直報錯!提示獲取不到使用者例項!
	各種測試,kernel.php, route.php, BaseController, middleware寫法,等等,找不到問題。甚至一度懷疑 parent::__contruct()繼承不對...

	最終發現,是建構函式和中介軟體的執行順序有問題:
		1.先執行建構函式
		2.再呼叫中介軟體
	所以,我的問題就是,login中介軟體要求使用者登入,而建構函式又先執行了,直接獲取使用者資訊,還未登入呢!


	百度發現一篇文章,描述了這個問題:
		https://laravel-china.org/topics/3218/laravel53-middleware-and-controller-construction-method-execution-sequence-problem

	/*
		它裡面提到了一句:
			不可在建構函式中,直接獲取到session變數或認證後的使用者例項!因為中介軟體還未啟動!

		這個描述的不準確!
			在使用者登入後,建構函式中,自然就獲取到session變數或認證後的使用者例項!

		主要還是中介軟體未在之前執行!說白了就是順序的問題!
	*/

	解決方法:
		都只能在route.php 中了
			1>要麼使用 route::get()->middle('login')
			2>要麼使用 route::get(['middleware' => 'login', xxx])
		最好的方法,應該是使用路由組 route::group(['middleware' => 'login'])

		或者是:
			拋棄在控制器中使用使用者例項