Doctrine 如何从Zend表单中适当地水合和提取条令实体
我刚从条令开始,重写了一些代码,以某种形式使用条令实体 我有一个实体企业,它与地址、员工、电子邮件等有1:n的关系。设置非常基本,运行良好 为了添加新业务,我为每个实体创建了一个BusinessForm和字段集。这里是表单的构造函数: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
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',
],
]);