【问题标题】:Access Auth in parent constructor in Laravel 5.3 [duplicate]在 Laravel 5.3 的父构造函数中访问 Auth [重复]
【发布时间】:2017-05-09 20:11:38
【问题描述】:

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

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

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

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

应用控制器:

<?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);
        }
    }

权限控制器:

<?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() 不转储用户?

【问题讨论】:

    标签: php laravel laravel-5 constructor controller


    【解决方案1】:

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

    您可以按照指南中的说明使用闭包中间件。

    来自文档

    在以前的 Laravel 版本中,您可以访问会话变量或 控制器构造函数中经过身份验证的用户。这是 从未打算成为框架的明确功能。在 Laravel 中 5.3,你不能在你的控制器的构造函数中访问会话或认证用户,因为中间件还没有运行

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

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

    【讨论】:

      【解决方案2】:

      请查看我的回答here

      如果您使用 Laravel 5.3,则需要将此检查移动到中间件中

      【讨论】:

        【解决方案3】:

        这是因为 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 请参阅 Session In The Constructor

        部分

        【讨论】:

        • 谢谢,我以为我疯了。注意,我们必须从中间件函数return $next($request);see this question
        • @DelightedD0D 对,我已经添加了这个来回答
        猜你喜欢
        • 2017-01-04
        • 1970-01-01
        • 2018-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多