从服务定位器调用doctrine 2实体时调用成员函数get()

时间:2014-08-28 16:31:45

标签: zend-framework orm doctrine-orm zend-framework2

我是Doctrine 2和ZF2的新手。

我的问题:如果我尝试访问{{1},我会转到实例化类myPage/bnk的路由BnkController和方法indexAction方法从那里一切正常

现在,当我在方法getEntityManager中实例化类DataManager然后我尝试在类indexAction中调用getEntityManager方法时,我得到DataManager如果它全部在Fatal error: Call to a member function get() on a non-object

中工作,我不明白为什么会发生这种情况

为什么当我尝试从课程BnkController中的EntityManager获取原则getServiceLocator时,我收到此错误?

DataManager

的DataManager

class BnkController extends AbstractActionController
    {
        public function indexAction ()
        {
            $this->uploadCSVAction( "data/bnk.csv" );
        }

        public function uploadCSVAction ( $fileName )
        {
            $parseCSV = new CsvParser();
            $dataManager = new DataManager();

            // Transforms CSV into Array
            $CSVData = $parseCSV->parseCSV( $fileName );

            // Makes sure that we are only using the right transactions and no overlap is happening
            $CSVData = $dataManager->validateTransactions($CSVData,$parseCSV);

            $dataManager->saveCSVDataToDB( $CSVData );

        }

        /**
         * @return \Doctrine\ORM\EntityManager
         */
        protected function getEntityManager ()
        {
            /** @var \Doctrine\ORM\EntityManager $objectManager */
            $objectManager = $this
                ->getServiceLocator()
                ->get( 'Doctrine\ORM\EntityManager' );

            return $objectManager;
        }

1 个答案:

答案 0 :(得分:2)

  

当我尝试从类DataManager中的getServiceLocator获取doctrine EntityManager时,为什么会出现此错误

DataManager不了解服务定位器或实体管理器。为什么?因为您是使用new运算符创建的。

$dataManager = new DataManager(); // nothing injected or set

您需要确保使用工厂注入依赖项,然后通过服务定位器请求它们。

更新控制器以获取服务

$dataManager = $this->getServiceLocator()->get('MyModule\Service\DataManager');

创建一个新工厂以注入 EntityManager (而不是服务定位器)

namespace MyModule\Factory;

use MyModule\Service\DataManager;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ServiceManager\FactoryInterface;

class DataManagerFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        return new DataManager(
            $serviceLocator->get('Doctrine\ORM\EntityManager')
        );
    }
}

向工厂注册服务经理

// MyModule\Module.php
public function getServiceConfig()
{
    return array(
        'factories' => array(
            'MyModule\Service\DataManager'
                => 'MyModule\Factory\DataManagerFactory',
        ),
    );
}

最后,给DataManager一个构造函数,这样就可以注入EntityManager

use Doctrine\Common\Persistence\ObjectManager;

class DataManager
{

    protected $objectManager;

    public function __construct(ObjectManager $objectManager)
    {
        $this->objectManager = $objectManager;
    }

    protected function getEntityManager ()
    {
      return $this->objectManager;
    }

}