Sai*_*akR 0 php laravel-5 laravel-5.4
在app\Http\Controller其中有一个名为Controller所有其他控制器继承的主控制器类.在任何其他控制器中,以下代码正常工作:
class OtherController extends Controller{
public function index(){
dd(\Auth::user()->id);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在Controller.php父类中,当我尝试在construct方法中执行类似的操作时,我尝试获取非对象错误的属性:
class Controller extends BaseController {
use AuthorizesRequests,
DispatchesJobs,
ValidatesRequests;
public $foo = 'null';
public function __construct() {
$this->middleware('auth');
dd(\Auth::user()->id);//Error is here.
dd(\Route::getCurrentRoute()->action['controller']);
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么能解决这个问题?
编辑以添加实际答案
parent::call_action()在行之前尝试声明此方法并将代码放入其中:
public function callAction($method, $parameters)
{
// Put your code right here
// then do this last
return parent::callAction($method, $parameters);
}
Run Code Online (Sandbox Code Playgroud)
从底部取出此页.缺点是callAction总是在调用目标方法之前调用,但它也在中间件运行后调用,因此您将能够正确访问您的auth外观.很有可能,无论你在构造函数中尝试做什么,都会按照你想要的方式在这个方法中工作.
原始答案
这是因为我在laravel 5.4中探讨了一下,但如果我没记错,中间件直到控制器构造函数之后才会触发,这意味着你特意不能做你想要做的事情.auth中间件不会使用登录用户填充Auth外观,直到构造控制器之后,但在调用控制器方法之前(这就是您的第一个示例工作的原因).
我相信这是预期的行为,因此不太可能改变.
缺点是(除非有更多知识渊博的人纠正我),你必须找到另一种方法去做你想做的事情.
编辑添加
实际上,这个问题清楚表明我的怀疑是正确的.中间件在控制器构造函数之后触发,这意味着您无法访问控制器构造函数内的登录用户.回想起来,显然是这种情况,因为您可以在控制器构造函数中做的一件事是指定系统应该运行哪些中间件.如果中间件已经运行,那么你将无法做到这一点.所以缺点是你不能(实际上)从控制器构造函数中访问Auth facade.这是laravel团队的故意,因此不会很快改变.你必须找到另一种方法来做到这一点.