Con đường tôi xử lý thuyết là thông qua Dịch vụ, tôi làm điều đó như sau:
//some Controller
public function someAction()
{
$service = $this->getServiceLocator()->get('my_entity_service');
return new ViewModel(array(
'entities' => $service->findAll()
));
}
Các Service->findAll()
sẽ giống như thế này:
public function findAll()
{
return $this->getEntityRepository()->findAll();
}
Bây giờ chúng ta cần phải xác định my_entity_service
. Tôi làm điều này bên trong của tôi Module.php
public function getServiceConfig()
{
return array(
'factories' => array(
'my_entity_service' => 'Namespace\Factory\MyServiceFactory'
)
);
}
Tiếp theo tôi tạo máy (lưu ý: điều này cũng có thể được thực hiện thông qua chức năng ẩn danh bên trong 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;
}
}
Bây giờ đây là rất nhiều để nhai: DI hoàn toàn hiểu được điều đó. Điều gì đang xảy ra ở đây thực sự là rất đơn giản. Thay vì tạo mô hình của bạn và bằng cách nào đó vào EntityManager, bạn gọi ServiceManager của ZF2 để tạo Mô hình cho bạn và tiêm EntityManager vào nó.
Nếu điều này vẫn còn khó hiểu với bạn, tôi sẽ sẵn sàng cố gắng giải thích bản thân mình tốt hơn. Để làm rõ thêm, tuy nhiên tôi muốn biết về trường hợp sử dụng của bạn. I.e: bạn cần EntityManager nào hoặc bạn cần nó ở đâu.
dụ Mã này nằm ngoài phạm vi câu hỏi
Chỉ cần để cung cấp cho bạn một ví dụ sống của một cái gì đó tôi làm qua ServiceFactories với các hình thức:
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;
}