我们的应用程序(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创建或更新引用的对象,就像直接使用保水器一样?我是否必须创建“子表单/字段集”?
答案 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());
}
}
确保您设置的字段集的名称与引用的名称相匹配,并且您设置了表单水合器。