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 层的构造函数也写一个中间件方法,像控制器那样?待测…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值