【问题标题】:"Call to a member function has() on a non-object" from Symfony 2 Controller来自 Symfony 2 控制器的“在非对象上调用成员函数 has()”
【发布时间】:2012-05-07 10:13:09
【问题描述】:

我收到一个错误

Fatal error: Call to a member function has() on a non-object in /labs/Projects/What2Do/vendor/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php on line 161

我不确定如何调试它。错误在 Symfony 2 文件中,不是我的……我的控制器如下所示。我正在运行indexAction

<?php
class ProjectsController extends Controller {

    /**
     * @var EntityManager 
     */
    protected $em;

    public function __construct() {
        $this->em = $this->getDoctrine()->getEntityManager();
    }

    /**
     * @Route("/")
     * @Route("/projects", name="listProjects")
     * @Template()
     */
    public function indexAction() {
        $projects = $this->em->getRepository(Project::NAME)->findAll();

        return array('projects' => $projects);
    }

    /**
     * @Route("/projects/{projId}", name="viewProject") 
     * @Template()
     */
    public function viewAction($projId) {
        // retrieve project
        $proj = $this->em->getRepository(Project::NAME)->findOneById($projId);
        if ($proj == null)
            throw $this->createNotFoundException ('Invalid project');

        return array('proj' => $proj);
    }
}

【问题讨论】:

  • 第 161 行是什么?请您突出显示它吗?

标签: symfony


【解决方案1】:

Symfony 2 控制器没有 __construct 方法,所以虽然调用父构造函数不是一个坏主意,但它不会有帮助。

问题是容器在 __construct 之后被注入,因此试图在构造函数中获取您的学说实体管理器根本行不通。我知道这有点违反直觉,但让经理了解你的行动方法。

我假设您的 Project::NAME 类常量中包含类似“ProjectBundle:Project”的内容。

【讨论】:

  • +1。依赖项是 setter-injected,因此 $this-&gt;getDoctrine() 失败,因为它使用 $this-&gt;container,即 null,因为依赖项容器是 setter-injected。
猜你喜欢
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多