2016-11-08 84 views
0

我們的應用程序(Zend Framework的2 + 2原則)具有Order實體,引用像BillingAddress等相關對象。我們已經實現了一個REST API來創建和更新訂單。數據被傳遞到該API作爲關聯數組和被引用的對象的數據可以封裝該數組內。 I. E.由Order API接收的數據看起來像這樣ZF2 +學說2:通過ZF2型水合物相關的對象

$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用於接收數據的易消毒。設置爲訂單的簡單屬性的Form是很容易

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

     $this 
      ->add([ 
       'name' => 'remarks', 
       'type' => 'text' 
      ]); 
    } 
} 

但我與引用的對象奮鬥。如何設置形式,使所引用的對象被創建或更新的原則,就像直接使用水化?我一定要創建一個「子表格/字段集」?

回答

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()); 

    } 
} 

請確保您設置的字段集的名稱,匹配參考的名稱和您設置的形式水化。

+0

謝謝你的建議,我目前正在實施和將標誌着你的答案是正確的,當我做了一切工作 – Subsurf

+0

這並獲得成功 – Subsurf