我刚开始学习教义,并重新编写一些代码在某些形式的使用原则的实体。如何正确滋润并提取主义实体从Zend的窗体
我有一个实体的业务,有一些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()
。如果我得到的数据和水合物形式的水化一个新的对象,像这样:$form->getHydrator()->hydrate($data['business], new Business())
我得到的填充对象我期待。 (业务是基本字段集的名称)
所以我的问题是,如何得到最后一次调用的结果,从验证后使用$form->getObject()
?
[编辑]
这个问题似乎是与字段集的用作businessfieldset子字段集的集合。如果我验证表单不使用集合我得到来自$form->getData()
下面的例子中,预期业务对象,我怎么添加集合(在业务字段集):
$this->add([
'name' => 'emails',
'type' => 'Zend\Form\Element\Collection',
'attributes' => [
'id' => 'business_emails',
],
'options' => [
'label' => 'Emails',
'count' => 1,
'should_create_template' => true,
'template_placeholder' => '__index__',
'allow_add' => true,
'target_element' => [
'type' => 'LwsSubcontractor\Form\EmailFieldset',
],
'target_class' => 'LwsSubcontractor\Entity\Email'
],
]);
这里的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 protected])',
'class' => 'form-control',
'required' => true,
'size' => 50,
],
'options' => [
'label' => 'Email',
],
]);
}
}
如果使用集合,我从上面得到的错误信息。所以加入水化每个字段集后,我很好。
虽然我的印象是设置表单的hydrator会导致使用的字段集继承hydrator.Or是因为使用字段集作为集合而不是直接?