Laravel 5.3+ 在控制器和模型的构造函数 __construct 使用 Session 方法

  这个问题有点坑,如果不按照规则来操作,很有可能取出来是一个 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 层的构造函数也写一个中间件方法,像控制器那样?待测…

猜你喜欢

转载自blog.csdn.net/maxsky/article/details/79855278