参考:https://laravel.com/docs/5.3/upgrade#5.3-session-in-constructors
控制器的构造函数中的无法使用session
在 Laravel5.3以前版本中,您可以在控制器的构造函数中访问会话变量或经过身份验证的用户。但在 Laravel 5.3以后,您无法在控制器的构造函数中访问session
或经过身份验证的用户,因为中间件尚未运行。
作为替代方案,您可以直接在控制器的构造函数中定义基于闭包的中间件。在使用此功能之前,请确保您的应用程序正在运行 Laravel5.3.4或更高版本:
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
class BaseController extends Controller
{
/**
* @var array 管理员信息
*/
public $adminInfo;
public function __construct()
{
//todo:"优雅"的laravel先执行完构造函数才执行中间件,但是只有执行中间件后才会开启session,暂时没有想到更好的办法只能这么"优雅"的实现先
//这里面可以访问 session 变量
$this->middleware(function ($request, $next) {
//业务代码
$action = Route::current()->getActionName();
list($class,$method) = explode('@',$action);
$class1 = explode('\\',$class);
$controller = array_pop($class1);
if( ! in_array($controller,['LoginController'])){
$this->_checkPermissions($controller,$method);
}
//业务代码结束
return $next($request);
});
}
protected final function _checkPermissions(string $contr, string $action){
$this->adminInfo = session('adminInfo');
if( ! $this->adminInfo){
header('Location:/admin/login/index');
exit();
}
//...其他业务代码
}
}