Php 如何使用扩展控制器中的方法?

Php 如何使用扩展控制器中的方法?,php,symfony,entitymanager,Php,Symfony,Entitymanager,我有一个控制器类HomeController,它有一个特殊的方法来获取实体管理器: protected function getImageManager() { if(!isset($_SESSION)) session_start(); if(isset($_SESSION['id'])) { if($em = $this->getDoctrine()->getEntityManager()) re

我有一个控制器类
HomeController
,它有一个特殊的方法来获取
实体管理器

protected function getImageManager() 
{
    if(!isset($_SESSION)) session_start();

    if(isset($_SESSION['id'])) 
    {                   
        if($em = $this->getDoctrine()->getEntityManager()) return $em;
    } 
    return false;
}
当我在
HomeController
中使用它时,它就会工作。但是当我扩展控制器并尝试使用此方法时,我得到一个错误:
致命错误:对/home/xxxx/webDir/project/vendor/symfony/symfony/src/symfony/Bundle/FrameworkBundle/controller/controller.php中的非对象调用has()

这就是我在
HomeController
和扩展控制器中使用此方法的方式:

if($em = $this->getImageManager())
...
这就是我如何扩展HomeController的方法:

namespace MSD\HomeBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use MSD\HomeBundle\Entity\Imagen as Imagen;
use MSD\HomeBundle\Controller\HomeController as HomeController;

class ImageTransController extends HomeController
{
function __construct()
{
    if($em = $this->getImageManager()) return $this;
        else $this->setError('Entity Manager error');
    }
}

你知道哪里出了问题吗?

你在这里做了很多错事

  • 会话在Symfony中自动启动,因此您不必手动启动它
  • 当您需要的是EntityManager时,为什么要调用getImageManager
  • 为什么要重写构造函数
  • 你应该这样做

    // HomeController.php
    public function getEntityManager()
    {
        return $this->getDoctrine()->getEntityManager();
    }
    
    // ImageTransController
    class ImageTransController extends HomeController
    {
        public function someAction()
        {
            $em = $this->getEntityManager();
            // do something with $em
        }
    }
    

    HomeController
    没有任何构造方法。它也属于我在较新的帖子中提到的依赖项注入概念。现在我知道问题是在构造函数中调用实体管理器。你可以看看我的新问题: