symfony - getUser() 方法在控制器构造函数中不起作用
问题描述
我想在 Symfony 4.3.2 项目的控制器构造器中获取用户对象。根据https://symfony.com/doc/4.0/security.html#retrieving-the-user-object上的文档,我只需要调用 $this->getUser()。是的,这适用于行动方法。
但是:尝试在构造函数中获取用户不起作用,因为容器不会在此处初始化,并且 getUser 方法会引发异常“调用成员函数 has() on null”:此时容器为 null及时。
这有效:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class TestController extends AbstractController
{
public function indexAction()
{
dump($this->getUser());
}
}
这不会:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class TestController extends AbstractController
{
public function __contruct()
{
dump($this->getUser());
}
public function indexAction()
{
}
}
当我手动注入容器时,一切都很好:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class TestController extends AbstractController
{
public function __construct(ContainerInterface $container)
{
$this->container = $container;
dump($this->getUser());
}
public function indexAction()
{
}
}
顺便说一句,这是 AbstractController 中的 getUser 方法:
protected function getUser()
{
if (!$this->container->has('security.token_storage')) {
throw new \LogicException('The SecurityBundle is not registered in your application. Try running "composer require symfony/security-bundle".');
}
......
这是一个错误,容器未在构造函数中初始化,还是一个特性,当您需要构造函数中的用户时,您必须手动初始化它?
编辑:使用https://symfony.com/blog/new-in-symfony-3-2-user-value-resolver-for-controllers中显示的方式在动作中起作用,但在构造函数中不起作用:
....
private $user;
public function __construct(UserInterface $user)
{
$this->user = $user;
}
产生以下错误消息:Cannot autowire service "App\Controller\TestController": argument "$user" of method "__construct()" references interface "Symfony\Component\Security\Core\User\UserInterface" but no such service exists. Did you create a class that implements this interface?
。这就是我想设置用户对象的地方。
解决方案
切勿使用 $security->getUser()
或$this->getUser()
在构造函数中!
身份验证可能尚未完成。(在 Service 中,存储整个 Security 对象。:
symfony.com/doc/security.html#a-fetching-the-user-object
...并且您可以$this->getUser()
在任何控制器中使用通过 AbstractController 扩展的内容。(只是不在构造函数中)
推荐阅读
- json - 我的浏览器如何知道它应该为特定站点创建哪种 json 对象?
- reactjs - 将 audioTrack 和 videoTrack 存储在 redux 状态是一种不好的做法吗?
- jsf - 有没有办法在rich:extendedDataTable 中使用rich:columnGroup?
- r - 如何在r中绘制日期(日和月)
- css - 使用 GatsbyJs 在 Contentful 上列出短文本列表的所有值的方法
- google-api - 请求与谷歌驱动器的身份验证范围不足
- netbeans - Netbean 12.0,如何生成包的类图和/或序列图
- javascript - $('#input5').val(total) return input:157 指定值“1.234.567”无法解析,还是超出范围?
- android - 如何识别唯一登录用户以进行应用内购买?
- javascript - 将电子表格上不同工作表的列数与应用程序脚本进行比较的脚本