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 的东西),因为它们在控制器中很常见/使用。
TA贡献1765条经验 获得超5个赞
另一个想法,即使我更喜欢关于自动装配的想法:您是否检查过父构造函数是否有帮助?如果你扩展一个类(就像你正在做的那样extends AbstractController),你不应该忘记调用parent::__construct(),也许是你自己construct方法中的第一件事。这确保了父类正常工作所需的一切都被实例化。
- 2 回答
- 0 关注
- 169 浏览
添加回答
举报
