我剛開始學習教義,並重新編寫一些代碼在某些形式的使用原則的實體。如何正確滋潤並提取主義實體從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是因爲使用字段集作爲集合而不是直接?