这个问题有点坑,如果不按照规则来操作,很有可能取出来是一个 null,或空数组。
当我看到这句话时才明白:
In Laravel 5.3, you can’t access the session or authenticated user in your controller’s constructor because the middleware has not run yet.
在 Laravel 5.3 中,因为中间件未运行所以导致你无法访问控制器构造函数中的 session 或已验证的用户。
明白了就简单多啦:
private $user_id;
// 一个简单的通过 session 取用户 ID 例子,还必须这么写...
public function __construct() {
$this->middleware(function ($request, $next) {
$this->user_id = session()->get('user_id');
// 也可使用 Session::get('user_id'); 需申明 use Session;
return $next($request);
});
}
还有一个坑,上方代码是 Controller 中的,如果在 Model 层中,假设是这样的代码:
private $user_id;
public function __construct(array $attributes = [])
parent::__construct($attributes);
$this->user_id = session()->get('user_id');
}
也是有可能取出来是 null
的…后来我发现一个事儿,这个 Model
也需要在那个 middleware
方法里走一遍。
当然每个人需求不一样,我这儿假设我有一个 UserModel
,那么控制器 UserController
里的构造函数就得这样:
private $user_id;
private $userModel;
public function __construct() {
$this->middleware(function ($request, $next) {
$this->user_id = session()->get('user_id');
$this->userModel = new UserModel();
return $next($request);
});
}
实例化以后…UserModel
的构造函数里也能用 session 了,咳咳咳…
或许不用实例化,给 Model
层的构造函数也写一个中间件方法,像控制器那样?待测…