在 Laravel 5.3 的父构造函数中访问 Auth
Access Auth in parent constructor in Laravel 5.3
我正在 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()
不转储用户?
控制器构造在任何中间件之前执行,因此还没有用户(https://laravel.com/docs/5.3/upgrade#upgrade-5.3.0)
您可以按照指南中的说明使用闭包中间件。
来自文档
In previous versions of Laravel, you could access session variables or
the authenticated user in your controller's constructor. This was
never intended to be an explicit feature of the framework. 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.4 或以上:
public function __construct()
{
$this->middleware(function ($request, $next) {
$this->user = auth()->user();
return $next($request);
});
}
请检查我的回答。
如果您使用 Laravel 5.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
部分
我正在 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()
不转储用户?
控制器构造在任何中间件之前执行,因此还没有用户(https://laravel.com/docs/5.3/upgrade#upgrade-5.3.0)
您可以按照指南中的说明使用闭包中间件。
来自文档
In previous versions of Laravel, you could access session variables or the authenticated user in your controller's constructor. This was never intended to be an explicit feature of the framework. 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.4 或以上:
public function __construct()
{
$this->middleware(function ($request, $next) {
$this->user = auth()->user();
return $next($request);
});
}
请检查我的回答
如果您使用 Laravel 5.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
部分