2017-09-01 83 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)注册和检索表单和字段集。表单可以被注入到你的控制器中。

我希望这会有所帮助。