Laravel 5.4 Sessions和Auth :: user()在控制器的构造函数中不可用

时间:2017-06-08 20:32:41

标签: laravel authentication

我想在应用程序中使用User类。所以,我想创建CustomUser,然后将其注入需要它的控制器(它们中的大多数都是)。

现在,我在serviceprovider中创建一个空实例。接下来,我想用已经保存在Auth :: user()中的数据填充它。很长一段时间后,我还没有找到去哪里做。

Auth :: user()在中间件中是空的,但是在控制器中填充了用户数据。我错过了Laravel查询数据库并用数据填充Auth:user()的步骤。我想避免再次进行相同的查询。

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

自Laravel 5.3起,您无法访问控制器构造函数中的sessions。这是因为中间件还没有运行。我知道它很难找到,但是在5.2的迁移文档中> 5.3(您可能在5.4上),它表明从会话中解析数据的正确方法(其中auth()只是一个围绕session()调用以获取用户的包装器),是使用以下方法:

class MyController extends Controller {
    protected $user;

    public function __construct() {
        $this->middleware(function ($request, $next) {
           $this->user= auth()->user();

           return $next($request);
        });
    }
}

然后$this->user会将auth用户引用到此控制器内的任何方法。

希望他的帮助。

答案 1 :(得分:2)

您可以将基本控制器与__get() method一起使用。例如:

class Controller
{
    public function __get(string $name)
    {
        if($name === 'user'){
            return Auth::user();
        }

        return null;
    }
}

在子控制器中可以调用$this->user

答案 2 :(得分:0)

在Laravel 5.6中我使用了这个

$this->middleware(function ($request, $next) {
        $id = Auth::user()->id;
        $res = $this->validateAnyFunction($id);
        if(!$res){
        //to redirect to any other route
            return $next(redirect()->route("any")->with("failed","Invalid")->send());
        }
        //this is used to proccess futher funcitons of controller
        return $next($request);
    });