在app\Http\Controller
中,有一个名为Controller
的主控制器类,所有其他控制器都继承该类。在任何其他控制器中,以下代码可以正常工作:
class OtherController extends Controller{
public function index(){
dd(\Auth::user()->id);
}
}
然而,在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']);
}
}
我该如何解决这个问题?
答案 0 :(得分:5)
编辑以添加实际答案
尝试在parent::call_action()
行之前声明此方法并将代码放入其中:
public function callAction($method, $parameters)
{
// Put your code right here
// then do this last
return parent::callAction($method, $parameters);
}
取自this页面的底部。缺点是callAction总是在调用目标方法之前被调用,但在中间件运行之后它也被称为,因此您将能够正确访问您的auth外观。很有可能,无论你在构造函数中尝试做什么,都会按照你想要的方式工作。
原始答案
自从我在laravel 5.4中讨论过以来,我已经开始了一段时间,但如果我没记错,中间件在控制器构造函数之后才会触发,这意味着你专门不能做你想做什么。 auth中间件不会使用登录用户填充Auth外观,直到构造控制器之后,但在调用控制器方法之前(这就是您的第一个示例有效的原因)。
我认为这是预期的行为,因此不太可能改变。
缺点是(除非有更多知识渊博的人纠正我),你必须找到另一种方法去做你想做的事情。
编辑以添加
确实,this question表明我的怀疑是正确的。 控制器构造函数后,中间件触发,这意味着您无法访问控制器构造函数内的登录用户。回想起来,显然是这种情况,因为您可以在控制器构造函数中做的一件事是指定系统应该运行哪些中间件。如果中间件已经运行,那么你将无法做到这一点。所以缺点是你不能(实际上)从控制器构造函数中访问Auth facade。这是laravel团队的故意,因此不会很快改变。你必须找到另一种方法来做到这一点。
答案 1 :(得分:2)
我已根据您的错误更新了我的答案...请确保在文件顶部添加use Illuminate\Support\Facades\Auth;
现在有了laravel 4.2+,很容易获得用户的身份:
$userId = Auth::id();
就是这样。
但要检索除id之外的用户数据,请使用:
$email = Auth::user()->email;
有关详细信息,请查看security part of the documentation