2

ここで説明されている方法で zf2 フォームにドクトリン エンティティ マネージャーを挿入しようとしました http://zf2cheatsheet.com/#doctrine (フォームにエンティティ マネージャーを挿入) が、_construct() は Doctrine のインスタンスである必要があるというエラーで失敗します\ ORM\EntityManager、指定された null...

誰もこの問題を解決しましたか?

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 を取得するために汚い方法を使用しますが、Service Locator が必要になるとすぐに個人的にファクトリを作成します。サービスで大きなオーバーヘッドを作成する価値はないと思います。

これが少し役に立てば幸いです。

于 2013-07-29T14:46:06.007 に答える