ZF2 +学说2:通过ZF2形式

时间:2016-11-08 12:45:34

标签: php forms doctrine-orm zend-framework2

我们的应用程序(Zend Framework 2 + Doctrine 2)有一个Order实体,它引用了它的相关对象,如BillingAddress等。我们已经实现了REST API来创建和更新订单。数据作为关联数组传递给此API,引用对象的数据可以封装在此数组中。 I. E. Order API收到的数据如下所示

$data = [
    // This is an attribute of the Order entity itself
    'remarks' => 'Urgent order', 
    // This is the data of the referenced BillingAddress
    'billing_address' => [
        'firstname' => 'Barry',
        'lastname' => 'Fooman'
    ]
];

首先要注意的是,给定的BillingAddress可以是新的也可以是现有的id!在后一种情况下,billing_address将成为DoctrineObject数据的一部分。

使用$hydrator = new DoctrineObject($entityManager); $hydrator->hydrate($order, $data); 保湿器

Zend\Form\Form

Doctrine负责自动更新或创建引用的对象。这就是我们到目前为止的工作方式:获取收到的数据,进行一些处理以消毒和验证数据并调用水化器。

但是我们现在想要使用Form来轻松清理收到的数据。为订单的简单属性设置class OrderForm extends \Zend\Form\Form { public function __construct() { parent::__construct('order'); $this ->add([ 'name' => 'remarks', 'type' => 'text' ]); } } 非常简单

crossorigin="use-credentials"

但我对引用的对象感到困惑。如何设置表单,以便Doctrine创建或更新引用的对象,就像直接使用保水器一样?我是否必须创建“子表单/字段集”?

1 个答案:

答案 0 :(得分:1)

是的,您可以为BusinessAddress实体创建一个字段集,然后将其添加到OrderForm。

use Zend\Form\Fieldset;

class BusinessAddressFieldset extends Fieldset
{
  public function __construct($entityManager)
{

    parent::__construct('businessAddress');

    $this->add(array(
        'name' => 'firstName',
        'type' => 'Zend\Form\Element\Text',
        'options' => array(
            'label' => 'First Name',
        ),
        'attributes' => array(
            'type' => 'text',
        ),
    ));

    $this->add(array(
        'name' => 'lastName',
        'type' => 'Zend\Form\Element\Text',
        'options' => array(
            'label' => 'Last Name',
        ),
        'attributes' => array(
            'type' => 'text',
        ),
    ));
}

}

然后将字段集添加到OrderForm:

class OrderForm
extends \Zend\Form\Form
{
    public function __construct()
    {
        parent::__construct('order');

        // add fields

        $this->add(new BusinessAddressFieldset()); 

    }
}

确保您设置的字段集的名称与引用的名称相匹配,并且您设置了表单水合器。