2

我试图以这里描述的方式以 zf2 形式注入教义实体管理器 http://zf2cheatsheet.com/#doctrine (Inject the Entity Manager to Form) 但它失败并出现错误_construct() must be an instance of Doctrine\ ORM\EntityManager,空给定...

有人解决了这个问题吗?

4

1 回答 1

4

有几种方法可以做到这一点。肮脏但更简单的方法是在您的控制器操作中提供表单实体管理器通过这样的参数:

/**             
 * @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');
...
}

更复杂但更好的方法需要您在模块 Module.php 中添加 getServiceconfig 函数:

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

在您的表单中,您需要实现 ServiceManagerAwareInterface 和 setServiceManager 设置器。

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,但是一旦我需要服务定位器,我就亲自创建了一个工厂,我认为用服务制造大量开销是不值得的。

我希望这会有所帮助。

于 2013-07-29T14:46:06.007 回答