我在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
会按预期转储用户。
<?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()
不会转储用户?
答案 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查看构造函数中的会话