我跟随Doctrine Hydrator tutorial一起关注,但是当我的fieldset包含ObjectSelect时,我遇到了问题。我在我的实体上使用ORM映射。基本上我有一个Role
实体id
和name
。我还有一个User
实体id
,name
和role
(ManyToOne)。我也有我的吸气剂和二传手。我的setRole()
方法将Role
实体作为参数传递。
/** @param Role $role */
public function setRole(\Application\Entity\Role $role) {
$this->role = $role;
}
我使用Doctrine Hydrator设置了一个UserFieldset。
$this->setHydrator(new DoctrineHydrator($objectManager, 'Application\Entity\User'))
->setObject(new User());
角色的对象选择
$this->add(array(
'type' => 'DoctrineModule\Form\Element\ObjectSelect',
'name' => 'role',
'options' => array(
'label' => 'Role',
'object_manager' => $objectManager,
'target_class' => 'Application\Entity\Role',
'property' => 'name'
)
));
然后我设置了一个UserForm来设置DoctrineHydrator并添加UserFieldset。
我的控制器操作
public function addUserAction() {
$objectManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
$form = new UserForm($objectManager);
$user = new User();
$form->bind($user);
if ($this->request->isPost()) {
$form->setData($this->request->getPost());
if ($form->isValid()) {
$objectManager->persist($user);
$objectManager->flush();
}
}
return array('form' => $form);
}
似乎正在发生的是角色的ID传递给setRole而不是对象。作为一种解决方法,我已将我的操作修改为:
if ($form->isValid()) {
$objectManager->persist($user);
$data = $this->request->getPost();
$role = $objectManager->find('Application\Entity\Role', $data->user['role']);
$user->setRole($role);
$objectManager->flush();
}
似乎不需要这个附加步骤,但我不确定是否需要修改我的setRole或者是否还需要将Role实体绑定到表单。这显然是一个简化的例子,但是我的实际表单有许多关联,这对于在控制器中编码是很乏味的。
更新: 调试有关帖子和表单的信息。
var_dump($form->getData());
var_dump($this->request->getPost());
输出
object(Application\Entity\User)[395]
protected 'id' => int 6
protected 'name' => string 'Jane Doe' (length=8)
protected 'role' => null
object(Zend\Stdlib\Parameters)[146]
public 'user' =>
array (size=3)
'id' => string '' (length=0)
'name' => string 'Jane Doe' (length=8)
'role' => string '3' (length=1)
public 'submit' => string 'Add User' (length=8)
答案 0 :(得分:3)
我终于开始工作了。问题是我需要将角色添加到字段集
上的输入过滤器public function getInputFilterSpecification() {
return array(
'name' => array('required' => true),
'role' => array('required' => true)
)
}
...和我表格上的验证小组。
$this->setValidationGroup(array(
'User' => array(
'name',
'role'
)
));
现在要将用户保存在我的操作中,它只是
if ($form->isValid()) {
$objectManager->persist($user);
$objectManager->flush();
}