2017-09-01 81 views
1

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

回答

0

你必須水化器添加到您所有的字段集,我個人使用DoctrineModule\Stdlib\Hydrator\DoctrineObject的學說實體。

我也會看看使用init()方法初始化表單並添加元素,然後通過FormElementManager,$serviceLocator->get('FormElementManager')->get(yourFieldsetorForm::class)註冊和檢索表單和字段集。表單可以被注入到你的控制器中。

我希望這會有所幫助。