Orm 使用Zend表单保存包含ObjectSelect元素的Doctrine 2实体

Orm 使用Zend表单保存包含ObjectSelect元素的Doctrine 2实体,orm,doctrine-orm,zend-framework2,zend-form,Orm,Doctrine Orm,Zend Framework2,Zend Form,我一直在关注,但当我的字段集包含ObjectSelect时,我在保存时遇到了问题。我正在实体上使用ORM映射。基本上,我有一个角色实体,具有id和名称。我还有一个用户实体,具有id、名称和角色(manytone)。我也有我的能手和二传手。我的setRole()方法将Role实体作为参数传递 /** @param Role $role */ public function setRole(\Application\Entity\Role $role) { $this->role =

我一直在关注,但当我的字段集包含ObjectSelect时,我在保存时遇到了问题。我正在实体上使用ORM映射。基本上,我有一个
角色
实体,具有
id
名称
。我还有一个
用户
实体,具有
id
名称
角色
(manytone)。我也有我的能手和二传手。我的
setRole()
方法将
Role
实体作为参数传递

/** @param Role $role */
public function setRole(\Application\Entity\Role $role) {
    $this->role = $role;
}
我设置了一个用户字段集,其中包含一个

$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,或者是否还需要将角色实体绑定到表单。这显然是一个简化的示例,但我的实际表单有许多关联,如果必须像这样在控制器中编写代码,那么这些关联将非常繁琐

更新: 调试有关post和表单的信息

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)

我终于让它工作了。问题是我需要将角色添加到字段集的输入过滤器中

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();
}

能否检查
$form->getData()
是否返回正确的对象?或者只是身份证。实际上只有ID应该从
setRole()
方法返回一个错误(因为它应该是一个对象而不是ID),我已经添加了调试信息。post数据包含角色的ID,但是当设置为表单时,显然因为角色不是角色对象,所以不会设置它。