Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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
Php 无法在构造函数中获取会话_Php_Symfony_Symfony4 - Fatal编程技术网

Php 无法在构造函数中获取会话

Php 无法在构造函数中获取会话,php,symfony,symfony4,Php,Symfony,Symfony4,我正在使用$this->id=$this->get'session'->get'id';在我的_构造方法中,我得到以下错误: 调用成员函数get on null 我还尝试了$this->id=$this->container->get'session->get'id';但我也犯了同样的错误 如果我在另一个方法中使用它,而不是在_构造中使用它,那么代码将起作用 这是代码的样子: class ProfileDao extends AbstractController { private $i

我正在使用$this->id=$this->get'session'->get'id';在我的_构造方法中,我得到以下错误:

调用成员函数get on null

我还尝试了$this->id=$this->container->get'session->get'id';但我也犯了同样的错误

如果我在另一个方法中使用它,而不是在_构造中使用它,那么代码将起作用

这是代码的样子:

class ProfileDao extends AbstractController {
    private $id;
    private $em;

    function __construct() {
        $this->id = $this->get('session')->get('id');
        $this->em = $this->getDoctrine()->getManager();
    }
}
我做错了什么?

获取服务以及获取原则(这也是一项服务)的功能都是通过访问容器来完成的。如有疑问,请参阅参考,该容器在创建后通过在AbstractController上设置。这通常是因为它实现了ContainerWareInterface,这向symfony的依赖项注入组件发出了信号,它应该得到一个容器集,我不知道为什么/什么时候完成了。。。tbh

由于对象上的非静态方法在本例中只能在从其构造函数创建对象后从外部调用,并且由于setContainer是对象上的非静态方法,因此AbstractController只能在构造函数完成后拥有容器,而不能在构造函数运行时拥有容器

这就是为什么这两个方法调用都不起作用的原因

问题的解决方案非常简单,因为绝对有效的方法是正确地注入所需的类:

use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Doctrine\ORM\EntityManagerInterface;

class ProfileDao extends AbstractController {
    private $id;
    private $em;

    function __construct(EntityManagerInterface $em, SessionInterface $session) {
        $this->id = $session->get('id');
        $this->em = $em;
    }
}

通常,我避免使用容器,因为它绝对隐藏了控制器的依赖关系。我倾向于在不显式注入的情况下使用一些依赖项,通常是Twig和一些HttpKernel/HttpFoundation之类的东西,因为它们在控制器中非常常见。

另一个想法,即使我更喜欢关于自动布线的想法:您检查过父构造函数是否有帮助吗?如果您像使用extends AbstractController那样扩展一个类,那么您不应该忘记调用parent::\u构造,这可能是您自己的构造方法中的第一件事。这可以确保父类正常工作所需的所有内容都被实例化。

您能分享完整的代码示例吗?@NicoHaase当然,我已经更新了我的问题。回答得很好。这对我帮助很大。非常感谢。