猿问

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

我$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();

    }

}

我究竟做错了什么?


慕工程0101907
浏览 170回答 2
2回答

森林海

功能ControllerTrait::get($id)(获取服务)以及ControllerTrait::getDoctrine()(获取原则,这也是一项服务)都是通过访问容器来完成的(如有疑问,请参阅参考资料),该容器在创建后AbstractController通过 via设置(this曾经这样做是因为它实现了,它向 symfony 的依赖注入组件发出信号,它应该得到一个容器集,我不知道现在为什么/何时完成...... tbh)。AbstractController::setContainer($container) ContainerAwareInterface而且,由于一个对象(在非静态方法AbstractController中的这种情况下)只能被称为(从外侧)的对象已经从它的构造创建之后,并且由于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 的东西),因为它们在控制器中很常见/使用。

POPMUISE

另一个想法,即使我更喜欢关于自动装配的想法:您是否检查过父构造函数是否有帮助?如果你扩展一个类(就像你正在做的那样extends AbstractController),你不应该忘记调用parent::__construct(),也许是你自己construct方法中的第一件事。这确保了父类正常工作所需的一切都被实例化。
随时随地看视频慕课网APP
我要回答