7

私は問題があります。コントローラーなしで Entity-Manager を取得しようとしましたが、方法が見つかりませんでした。この時点で、次のように Entity-Manager を取得します。

(Controller)
public function getEntityManager()
{
    if (null === $this->_em) {
        $this->_em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
    }
    return $this->_em;
}

(Plugin)
public function getEntityManager()
{
    if($this->_em == null){
        $this->_em = $this->getController()->getServiceLocator()->get('doctrine.entitymanager.orm_default');
    }
    return $this->_em;
}

ほら、私は常にコントローラーが必要です。しかし、モデルに EntityManager が必要な場合、問題があります。モデルにコントローラーを与えることはできますが、これは本当に悪い方法だと思います。

コントローラーなしで EntityManager を取得する考えはありますか?

4

2 に答える 2

8

私が Doctrine を処理する方法は、Services を使用することです。次のように行います。

//some Controller
public function someAction()
{
    $service = $this->getServiceLocator()->get('my_entity_service');
    return new ViewModel(array(
        'entities' => $service->findAll()
    ));
}

は次のService->findAll()ようになります。

public function findAll()
{
    return $this->getEntityRepository()->findAll();
}

を定義する必要がありますmy_entity_service。私は私の中でこれを行いますModule.php

public function getServiceConfig()
{
    return array(
        'factories' => array(
            'my_entity_service' => 'Namespace\Factory\MyServiceFactory'
        )
    );
}

次に、Factory を作成します (注: これは、Module.php 内の匿名関数を介して行うこともできます)。

<?php
namespace Namespace\Factory;

use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ServiceManager\FactoryInterface;
use Namespace\Model\MyModel;

class MyServiceFactory implements FactoryInterface
{
    /**
     * Create service
     *
     * @param ServiceLocatorInterface $serviceLocator
     * @return mixed
     */
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $myModel= new MyModel();
        $myModel->setEntityManager($serviceLocator->get('Doctrine\ORM\EntityManager'));

        return $myModel;
    }    
}

今、これは噛むことがたくさんあります:DIは完全にそれを理解しています. ここで起こっていることは、実際には非常に単純です。モデルを作成して何らかの方法で EntityManager に到達する代わりに、ZF2 の ServiceManager を呼び出してモデルを作成し、それに EntityManager を注入します。

これでもまだ混乱している場合は、喜んで自分自身をよりよく説明します。さらに明確にするために、ユースケースについて知りたいと思います。つまり、EntityManager は何のために必要なのか、正確にはどこで必要なのか。

このコード例は質問範囲外です

フォームを使用して ServiceFactories を介して私が行っていることの実際の例を示します。

public function createService(ServiceLocatorInterface $serviceLocator)
{
    $form = new ReferenzwertForm();
    $form->setHydrator(new DoctrineEntity($serviceLocator->get('Doctrine\ORM\EntityManager')))
         ->setObject(new Referenzwert())
         ->setInputFilter(new ReferenzwertFilter())
         ->setAttribute('method', 'post');

    return $form;
}
于 2012-10-25T09:31:20.287 に答える
4

あなたの本当の質問は、「自分のクラスで ServiceManager のインスタンスを取得する方法」です。

これについては、ドキュメントをご覧ください: (ページの下部http://zf2.readthedocs.org/en/latest/modules/zend.service-manager.quick-start.html )

デフォルトでは、Zend Framework MVC は、Zend\ServiceManager\ServiceLocatorAwareInterface を実装する任意のクラスに、Zend\ServiceManager\ServiceLocatorInterface の実装である ServiceManager インスタンスを挿入するイニシャライザを登録します。簡単な実装は次のようになります。

クラスに ServiceLocatorInterface を実装してから、クラス内で次のように呼び出すことができます。

$this->getServiceLocator()->get('doctrine.entitymanager.orm_default');

または登録したその他のサービス。

于 2012-10-30T17:47:26.020 に答える