从服务定位器调用教义 2 实体时调用成员函数 get()
Posted
技术标签:
【中文标题】从服务定位器调用教义 2 实体时调用成员函数 get()【英文标题】:Call to a member function get() when calling a doctrine 2 entity form the service locator 【发布时间】:2014-08-28 16:31:44 【问题描述】:我是 Doctrine 2 和 ZF2 的新手。
我的问题:如果我尝试从那里访问 getEntityManager
方法所有作品。
现在,当我在方法indexAction
中实例化类DataManager
然后我尝试在类DataManager
中调用getEntityManager
方法时,我得到Fatal error: Call to a member function get() on a non-object
,我不明白为什么会发生这种情况都在BnkController
工作
为什么当我尝试从 DataManager
类中的 getServiceLocator
获取教义 EntityManager
时出现此错误?
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;
数据管理器
<?php
namespace Bnk\Controller;
/**
* Class DataManager
*
* @package Bnk\Controller
*/
class DataManager
/**
* @return \Bnk\Repository\Transaction
*/
protected function getTransactionRepository ()
/** @var \Bnk\Repository\Transaction $repository */
$repository = $this->getEntityManager()->getRepository( 'Bnk\Entity\Transaction' );
return $repository;
/**
* @return \Doctrine\ORM\EntityManager
*/
protected function getEntityManager ()
/** @var \Doctrine\ORM\EntityManager $objectManager */
$objectManager = $this
->getServiceLocator()
->get( 'Doctrine\ORM\EntityManager' );
return $objectManager;
【问题讨论】:
请使用DataManager
类更新您的问题。
谢谢,我已将其缩减为 我认为 是相关的部分。随意恢复它,但我认为它使你的要求更清楚。
【参考方案1】:
为什么当我尝试从 DataManager 类中的 getServiceLocator 获取学说 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;
【讨论】:
以上是关于从服务定位器调用教义 2 实体时调用成员函数 get()的主要内容,如果未能解决你的问题,请参考以下文章