为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕工程0101907 2022-01-08 20:44:26
我$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 回答

?
森林海

TA贡献2011条经验 获得超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 的东西),因为它们在控制器中很常见/使用。


查看完整回答
反对 回复 2022-01-08
?
POPMUISE

TA贡献1765条经验 获得超5个赞

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


查看完整回答
反对 回复 2022-01-08
  • 2 回答
  • 0 关注
  • 169 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号