ここで述べたように、フォームの選択ボックスで関連オブジェクトを処理するためのカスタム ハイドレーション戦略を構築しています。
私のフォームは次のようになります。
$builder = new AnnotationBuilder($entityManager);
$form = $builder->createForm(new MyEntity());
$form->add(new MyFieldSet());
$hydrator = new ClassMethodsHydrator();
$hydrator->addStrategy('my_attribute', new MyHydrationStrategy());
$form->setHydrator($hydrator);
$form->get('my_attribute')->setValueOptions(
$entityManager->getRepository('SecEntity\Entity\SecEntity')->fetchAllAsArray()
);
MyEntity
すべてを介して新しいものを追加すると、addAction
すべてがうまく機能します。
fetchAllAsArray()
選択ボックスに入力するために書きました。それは私の SecEntityRepository 内に存在します:
public function fetchAllAsArray() {
$objects = $this->createQueryBuilder('s')
->add('select', 's.id, s.name')
->add('orderBy', 's.name ASC')
->getQuery()
->getResult();
$list = array();
foreach($objects as $obj) {
$list[$obj['id']] = $obj['name'];
}
return $list;
}
しかし、編集の場合、extract()
関数は機能しません。私は何かが見える時点ではないhydrate()
ので、今は省略します。
私のハイドレーター戦略は次のようになります。
class MyHydrationStrategy extends DefaultStrategy
{
public function extract($value) {
print_r($value);
$result = array();
foreach ($value as $instance) {
print_r($instance);
$result[] = $instance->getId();
}
return $result;
}
public function hydrate($value) {
...
}
問題は次のとおりです。
致命的なエラー: 非オブジェクトでのメンバー関数 getId() の呼び出し
でprint_r($value)
始まるものを返します
DoctrineORMModule\Proxy__CG__\SecEntity\Entity\SecEntity オブジェクト
次に、BasicEntityPersister について何かを説明し、混乱のどこかに私の参照エンティティを示します。
print_r($instance)
何も印刷されません。ただ空っぽです。したがって、エラーメッセージは正当だと思います...しかし、これらのオブジェクトを反復処理できないのはなぜですか?
何か案は?
編集:
@サムに関して:
エンティティ内の私の属性:
/**
* @ORM\ManyToOne(targetEntity="Path/To/Entity", inversedBy="whatever")
* @ORM\JoinColumn(name="attribute_id", referencedColumnName="id")
* @Form\Attributes({"type":"hidden"})
*
*/
protected $attribute;
私の新しい選択ボックス:
$form->add(array(
'name' => 'attribute',
'type' => 'DoctrineModule\Form\Element\ObjectSelect',
'attributes' => array(
'required' => true
),
'options' => array(
'label' => 'MyLabel',
'object_manager' => $entityManager,
'target_class' => 'Path/To/Entity',
'property' => 'name'
)
));
私の最後の希望は、コントローラー内で何か間違ったことをしていることです。選択ボックスが事前に選択されておらず、値が保存されていません...
...
$obj= $this->getEntityManager()->find('Path/To/Entity', $id);
$builder = new \MyEnity\MyFormBuilder();
$form = $builder->newForm($this->getEntityManager());
$form->setBindOnValidate(false);
$form->bind($obj);
$form->setData($obj->getArrayCopy());
$request = $this->getRequest();
if ($request->isPost()) {
$form->setData($request->getPost());
if ($form->isValid()) {
$form->bindValues();
$this->getEntityManager()->flush();
return $this->redirect()->toRoute('entity');
}
}