Doctrine 如何从Zend表单中适当地水合和提取条令实体

Doctrine 如何从Zend表单中适当地水合和提取条令实体,doctrine,zend-form,zend-framework3,hydration,Doctrine,Zend Form,Zend Framework3,Hydration,我刚从条令开始,重写了一些代码,以某种形式使用条令实体 我有一个实体企业,它与地址、员工、电子邮件等有1:n的关系。设置非常基本,运行良好 为了添加新业务,我为每个实体创建了一个BusinessForm和字段集。这里是表单的构造函数: public function __construct($scenario='create', $entityManager = null) { parent::__construct('business_form'); $this->sce

我刚从条令开始,重写了一些代码,以某种形式使用条令实体

我有一个实体企业,它与地址、员工、电子邮件等有1:n的关系。设置非常基本,运行良好

为了添加新业务,我为每个实体创建了一个BusinessForm和字段集。这里是表单的构造函数:

public function __construct($scenario='create', $entityManager = null) {
    parent::__construct('business_form');
    $this->scenario = $scenario;
    $this->entityManager = $entityManager;
    $this->setAttribute('method', 'post');

    $businessFieldset = new BusinessFieldset($this->entityManager);
    $businessFieldset->setUseAsBaseFieldset(true);
    $this->add($businessFieldset);

    $hydrator = new DoctrineHydrator($this->entityManager, new Business());
    $this->setHydrator($hydrator);
    $this->addElements();
    $this->addInputFilter();
}
addElements只添加一个Submit和CSRF输入

这里是控制器的动作:

public function addAction(){
    $form = new BusinessForm('create', $this->entityManager);
    if ($this->getRequest()->isPost()) {
        $data = $this->params()->fromPost();                
        $form->setData($data);
        if($form->isValid()) {
            // save Object
            return $this->redirect()->toRoute('subcontractor', ['action'=>'index']);                
        }      
    } 
    return new ViewModel([
        'form' => $form
    ]);
}
表单进行验证,我可以使用
$form->getData()
从表单中获取数据。但是我不知道如何使用窗体的水合器从窗体中获取填充对象。当我在控制器的开头使用
setObject(new Business())
时,我在运行
$form->isValid()
时收到一个错误:

Zend\Hydrator\ArraySerializable::extract expects the provided object to implement getArrayCopy()
这不是打错电话了吗

如果我不使用
setObject()
,而是使用
$form->bind(new Business())
在验证后,我从
$form->getObject()
获得一个空对象。如果我获取数据并使用表单的hydrator或类似的方法创建一个新对象:
$form->getHydrator()->hydrator($data['business],new business())
我确实得到了我所期望的填充对象。(业务为基地集合的名称)

因此,我的问题是,如何在验证后仅使用
$form->getObject()
获得上一次调用的结果

[编辑]

问题似乎在于在businessfieldset中用作子字段集的字段集集合。如果我在不使用集合的情况下验证表单,我会从
$form->getData()

下面是我如何添加集合(在业务字段集中)的示例:

这里是EmailFieldset:

public function __construct() {
    parent::__construct('email');
    $this->setObject(new Email());
    $this->addElements();        
}

protected function addElements() {
    $this->add([
        'name' => 'email',
        'type' => 'Zend\Form\Element\Email',
        'attributes' => [
            'placeholder' => 'E-Mail (z.B. email@muster-email.de)',
            'class' => 'form-control',
            'required' => true,
            'size' => 50,
        ],
        'options' => [
            'label' => 'Email',
        ],
    ]);        
}

}

如果使用集合,我会从上面得到错误消息。所以在每一场比赛中加入一个水合器后,我就没事了


虽然我的印象是,为表单设置hydrator会导致使用的字段集继承该hydrator。还是因为将字段集用作集合而不是直接使用?

您必须将hydrator添加到所有字段集,就我个人而言,我对条令实体使用
DoctrineModule\Stdlib\Hydrator\DoctrineObject

我还将研究如何使用
init()
方法初始化表单并添加元素,然后通过FormElementManager,
$serviceLocator->get('FormElementManager')->get(yourFieldsetorForm::class)
注册并检索表单和字段集。可以将表单注入控制器中


我希望这会有所帮助。

您必须将hydrator添加到所有字段集,我个人使用
DoctrineModule\Stdlib\hydrator\DoctrineObject
作为条令实体

我还将研究如何使用
init()
方法初始化表单并添加元素,然后通过FormElementManager,
$serviceLocator->get('FormElementManager')->get(yourFieldsetorForm::class)
注册并检索表单和字段集。可以将表单注入控制器中

我希望这有帮助

public function __construct() {
    parent::__construct('email');
    $this->setObject(new Email());
    $this->addElements();        
}

protected function addElements() {
    $this->add([
        'name' => 'email',
        'type' => 'Zend\Form\Element\Email',
        'attributes' => [
            'placeholder' => 'E-Mail (z.B. email@muster-email.de)',
            'class' => 'form-control',
            'required' => true,
            'size' => 50,
        ],
        'options' => [
            'label' => 'Email',
        ],
    ]);