ここで説明されている方法で zf2 フォームにドクトリン エンティティ マネージャーを挿入しようとしました http://zf2cheatsheet.com/#doctrine (フォームにエンティティ マネージャーを挿入) が、_construct() は Doctrine のインスタンスである必要があるというエラーで失敗します\ ORM\EntityManager、指定された null...
誰もこの問題を解決しましたか?
ここで説明されている方法で zf2 フォームにドクトリン エンティティ マネージャーを挿入しようとしました http://zf2cheatsheet.com/#doctrine (フォームにエンティティ マネージャーを挿入) が、_construct() は Doctrine のインスタンスである必要があるというエラーで失敗します\ ORM\EntityManager、指定された null...
誰もこの問題を解決しましたか?
これを行うにはいくつかの方法があります。汚いが簡単な方法は、コントローラーアクションでエンティティマネージャートラフにフォームを次のように渡すことです。
/**
* @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 が必要になるとすぐに個人的にファクトリを作成します。サービスで大きなオーバーヘッドを作成する価値はないと思います。
これが少し役に立てば幸いです。