2013-07-29 3 views
2

Я попытался ввести администратор сущности доктрины в форму zf2 так, как описано здесь. http://zf2cheatsheet.com/#doctrine (Внесите диспетчер сущности в форму), но он с ошибкой _construct() должен быть экземпляром Doctrine \ ORM \ EntityManager, null given ...Inject Doctrine Entity Manager to Zf2 Form

Кто-нибудь решил эту проблему?

+0

Можете ли вы разместить свой код, пожалуйста, –

+0

. Некоторый код поможет нам вести вас. – 125369

ответ

4

Существует несколько способов, как это сделать. Грязный, но проще всего просто дать форму в своем действии The Entity менеджер контроллера корыто параметров следующим образом:

/**    
* @var Doctrine\ORM\EntityManager 
*/     
protected $em; 

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

public function setEntityManager(EntityManager $em) 
{ 
    $this->em = $em; 
} 
... 
public function yourAction() { 
... 
    $form = new YourForm($this->getEntityManger()); 
... 
} 

Затем можно просто вызвать методы объекта диспетчера в вашей форме:

public function __construct($em) 
{ 
... 
    $repository = $em->getRepository('\Namespace\Entity\Namespace'); 
... 
} 

более сложный, но красивый способ требует, чтобы добавить функцию getServiceconfig внутри модулей module.php:

public function getServiceConfig() 
{ 
    return array(
     'factories' => array(
      'YourFormService' => function ($sm) { 
       $form = new YourForm($sm); 
       $form->setServiceManager($sm); 
       return $form; 
      } 
     ) 
    ); 
} 

в вашей форме Там вы можете нужно implent в ServiceMa nagerAwareInterface и setServiceManager setter.

use Zend\Form\Form as BaseForm; 
use Zend\ServiceManager\ServiceManager; 
use Zend\ServiceManager\ServiceManagerAwareInterface; 

class CategoryForm extends BaseForm implements ServiceManagerAwareInterface 
{ 
protected $sm; 

public function setServiceManager(ServiceManager $sm) 
{ 
    $this->sm = $sm; 
} 

public function __construct($sm) 
{ 
... 
$em = $sm->get('Doctrine\ORM\EntityManager'); 
... 
} 

Затем вам нужно позвонить по своей форме в свой контроллер по-разному. Обычный конструктор $form = new YourForm(); не будет работать с фабрикой, которую мы создали.

$form = $this->getServiceLocator()->get('YourFormService'); 

Я обычно использую грязный способ получить EntityManager, но как только мне нужен Service Locator создать фабрику лично я не думаю, что его стоит того, чтобы создать большую нагрузку с услугами.

Надеюсь, это немного помогло.

+1

Переход с вариантом 2 и просто введение администратора сущности - лучший подход, нет необходимости вводить весь сервисный менеджер. –

+0

Спасибо, ребята, за ваши ответы! Я пробовал первый метод, но он дал мне ошибку - «_construct() должен быть экземпляром Doctrine \ ORM \ EntityManager, null given ...». Я попробую второй метод с serviceManager позже (теперь я немного занят), и я прокомментирую результат. – user2623505

+0

Вам не нужно вручную устанавливатьServiceLocator() на свой объект. Если класс является экземпляром ServiceLocatorAwareInterface, лучше зарегистрировать эту службу как invokable вместо фабрики. Менеджер сервиса автоматически добавит ServiceLocator. –

Смежные вопросы