从服务定位器调用教义 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()的主要内容,如果未能解决你的问题,请参考以下文章

教义存储库与私人成员

在字符串错误时调用成员函数 profile()

Symfony 3调用字符串上的成员函数格式()

魔术方法

魔术方法

魔术方法