如前所述这里我建立一个自定义的水化战略来处理的形式的选择框我的相关对象。
我的形式如下:
$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 \实体\ SecEntity对象
有一些关于BasicEntityPersister和地方的一塌糊涂以下是我引用的实体。
该print_r($instance)
打印什么。 这只是空的。 因此,我的猜测是错误消息合法......但为什么我不能遍历这些对象呢?
有任何想法吗?
编辑:
关于到@Sam:
我在实体属性:
/**
* @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');
}
}