私が 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;
}