在Laravel 5.3中访问父构造函数中的Auth

时间:2016-12-24 11:51:22

标签: php laravel laravel-5 constructor controller

我在Laravel 5.3中开发应用程序。我创建了一个AppController。我希望我的所有控制器都扩展AppController,以便它们共享一些常见的属性和方法。

鉴于以下2个实现,我的目的是在构造$this->user时将当前用户设置为AppController,以便所有扩展AppController的控制器都可以使用它。

我希望当我调用\App\Http\Controllers\User\PermissionController@test时,我应该将我的用户对象转储两次。在初始化AppController时,以及在调用PermissionController@test时再次。

但是,在AppController __construct()内,$this->user始终为NULL,而PermissionController@test会按预期转储用户。

AppController的:

<?php

    namespace App\Http\Controllers\App;

    use App\Http\Controllers\Controller;

    class AppController extends Controller
    {
        /**
         * The current user when logged in
         * @var \User
         */
        protected $user;

        public function __construct()
        {
            if(\Auth::check() ) {
                $this->user = \Auth::user();
            }
            var_dump($this->user);
        }
    }

PermissionController:

<?php

    namespace App\Http\Controllers\User;

    use App\Http\Controllers\App\AppController;

    class PermissionController extends AppController
    {
        public function test()
        {
            if(\Auth::check() ) {
                // Do something
                $this->user = \Auth::user() ;
            }
            var_dump($this->user);
        } 
    }

如果重要,我正在使用https://github.com/Adldap2/Adldap2-Laravel对Active Directory进行身份验证。

显然我误解了一些听到的东西。为什么AppController __construct()不会转储用户?

3 个答案:

答案 0 :(得分:1)

控制器构造在任何中间件之前执行,因此还没有用户(https://laravel.com/docs/5.3/upgrade#upgrade-5.3.0

您可以使用指南中描述的闭包中间件。

来自文档

  

在早期版本的Laravel中,您可以访问会话变量或   控制器构造函数中经过身份验证的用户。这是   从来没有打算成为框架的明确特征。在Laravel   5.3,您无法访问控制器构造函数中的会话或经过身份验证的用户,因为中间件尚未运行

作为替代方案,您可以直接在控制器的构造函数中定义基于Closure的中间件。在使用此功能之前,请确保您的应用程序正在运行Laravel 5.3.4或更高版本:

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

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

答案 1 :(得分:1)

请检查我的回答here

如果您使用的是Laravel 5.3,则需要在中间件中移动此检查

答案 2 :(得分:1)

这是因为Laravel 5.3的变化。如果你需要在构造函数中使用Auth,你需要这样做:

public function __construct()
{
     $this->middleware(function ($request, $next) {
             if(\Auth::check() ) {
                $this->user = \Auth::user();
            }
            var_dump($this->user);

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

此更改已在Laravel 5.3的升级指南中进行了介绍 - https://laravel.com/docs/5.3/upgrade#upgrade-5.3.0查看构造函数中的会话