Symfony getUser()方法不使用';不能在控制器构造函数中工作
我想在Symfony 4.3.2项目的controllers constructur中获取用户对象。根据上的文档,我只需要调用$this->getUser()。是的,这在行动方法中起作用 但是:尝试在构造函数中获取用户不起作用,因为容器将不会在此处初始化,并且getUser方法引发异常“调用成员函数has()on null”:此时容器为null 这项工作:Symfony getUser()方法不使用';不能在控制器构造函数中工作,symfony,symfony-4.3,Symfony,Symfony 4.3,我想在Symfony 4.3.2项目的controllers constructur中获取用户对象。根据上的文档,我只需要调用$this->getUser()。是的,这在行动方法中起作用 但是:尝试在构造函数中获取用户不起作用,因为容器将不会在此处初始化,并且getUser方法引发异常“调用成员函数has()on null”:此时容器为null 这项工作: 通过调用您提到的setContainer方法实例化控制器后,容器由ControllerResolver设置。因此,当调用构造函数时,容器在设
通过调用您提到的setContainer
方法实例化控制器后,容器由ControllerResolver
设置。因此,当调用构造函数时,容器在设计中不可用
您可能有一个用例,但我不明白为什么要这样做,因为在控制器方法中,您必须访问$user
属性,这样您只需键入get()
。您可以按照示例中所示注入整个容器,也可以只注入安全性
服务
use Symfony\Component\Security\Core\Security;
class TestController extends AbstractController
{
private $user;
public function __construct(Security $security)
{
$this->user = $security->getUser();
}
public function indexAction()
{
$user = $this->user; // Just saved you typing five characters
// At this point the container is available
}
}
我并没有实际设置安全服务,因为它稍后将通过容器变得可用
如果要执行此操作以对整个类实施访问控制,可以使用:
切勿在构造函数中使用$security->getUser()
或$this->getUser()
强>
身份验证可能尚未完成。(在服务中,存储整个安全对象:
…您可以在任何使用AbstractController扩展的控制器中使用$this->getUser()
。(只是不在构造函数中)感谢您的澄清。我确实有访问控制的注释。我需要将用户对象传递给服务,但我在Symfony 2.8中编程时不清楚,通过直接在服务中获取令牌存储对象已经可以做到这一点。现在,看看4.3文档,它是clear我不需要从控制器传递它。@LucHamers因为我没有更多的细节,所以我在黑暗中拍摄了一个可能的用例,这就是为什么我建议注释,但是是的,自己实例化依赖项会破坏DI的目的。很高兴它成功了。
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
/**
* @IsGranted('ROLE_USER')
*/
class TestController extends AbstractController
{
// Only authenticated user will be able to access this methods
}