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

时间:2019-09-13 21:48:51

标签: php symfony symfony4

我在$this->id = $this->get('session')->get('id');方法中使用__construct(),但出现此错误:

  

在null上调用成员函数get()

我也使用$this->id = $this->container->get('session')->get('id');进行了尝试,但是遇到了同样的错误。

如果我将其用于其他方法而不是在__construct()中使用,则该代码将起作用。

这是代码的样子:

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

    function __construct() {
        $this->id = $this->get('session')->get('id');
        $this->em = $this->getDoctrine()->getManager();
    }
}

我在做什么错了?

2 个答案:

答案 0 :(得分:2)

函数ControllerTrait::get($id)(获取服务)和ControllerTrait::getDoctrine()(获取学说,这也是一种服务)都通过访问容器来完成(如有疑问,请参阅参考) ,它是在创建后通过AbstractController::setContainer($container)通过AbstractControllerAbstractController上设置的(之所以这样做是因为它实现了ContainerAwareInterface,这表明symfony的依赖项注入组件,它应该有一个容器集,我不知道为什么/现在什么时候完成……tbh)。

并且由于对象的非静态方法(在这种情况下为{{3}})只能在从其构造函数创建了对象之后并且从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东西),因为它们在控制器中非常常见。

答案 1 :(得分:1)

另一个想法,即使我更喜欢自动装配的想法:您是否检查了父构造函数是否有帮助?如果扩展了一个类(就像您在使用extends AbstractController一样),则不要忘记调用parent::__construct(),这可能是您自己的construct方法中的第一件事。这样可确保实例化父类正常工作所需的所有内容。