我在$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();
}
}
我在做什么错了?
答案 0 :(得分:2)
函数ControllerTrait::get($id)
(获取服务)和ControllerTrait::getDoctrine()
(获取学说,这也是一种服务)都通过访问容器来完成(如有疑问,请参阅参考) ,它是在创建后通过AbstractController::setContainer($container)
通过AbstractController
在AbstractController
上设置的(之所以这样做是因为它实现了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
方法中的第一件事。这样可确保实例化父类正常工作所需的所有内容。