Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony getUser()方法不使用';不能在控制器构造函数中工作_Symfony_Symfony 4.3 - Fatal编程技术网

Symfony getUser()方法不使用';不能在控制器构造函数中工作

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设置。因此,当调用构造函数时,容器在设

我想在Symfony 4.3.2项目的controllers constructur中获取用户对象。根据上的文档,我只需要调用$this->getUser()。是的,这在行动方法中起作用

但是:尝试在构造函数中获取用户不起作用,因为容器将不会在此处初始化,并且getUser方法引发异常“调用成员函数has()on null”:此时容器为null

这项工作:


通过调用您提到的
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
}