2014-12-04 174 views
0

我一直在考慮一種處理POST請求中的嵌套/複雜值的好方法。POST請求中的嵌套參數/值

例如,訂單可能包含單個POST請求中的訂單項集合,用於創建訂單。訂單和訂單項都是作爲資源存在的。但是,我非常希望只有一個請求會創建訂單和訂單項目實體。處理資源中的問題不是問題,但我想知道如何使用apigiliy UI配置資源(讓我們稱之爲訂購地點) - 或者,如果完全不可能,請使用配置。應用驗證器和過濾器是appigility的關鍵特性之一,我想繼續使用它,即使對於複雜的請求數據。

並且在您提出要求之前,使用下劃線來分隔值範圍,例如order_comment和order_item_comment不應該是一個選項。

任何想法:)

加成:樣本json的請求負載可能看起來像這樣:

{ 
"created_at": "2000-01-01", 
"amount" : "5000.00", 
"address" : { 
    "name": "some name", 
    "street": "some street" 
    ... 
}, 
"items" : [ 
    {"productId":99,"qty":1} 
    ... 
] 
} 
+0

你可以提供一個示例JSON發送到服務器?希望以你的方式構建一個理想。 – Boris 2014-12-05 16:55:21

回答

1

如果您使用的是ContentValidation模塊,那麼你可以配置嵌套資源的輸入濾波器通過分配給一個變量。然後你必須添加一個類型鍵(否則重用過濾器將不起作用)。現在,您可以在input_filter_specs中使用此變量,並且可以在另一個過濾器中重新使用整個過濾器。因此,像這樣在你的config.php

<?php 

namespace Application; 

// Your address config as if it was used independently 
$addressInputFilter => array(
    'name' => array(
     'name' => 'name', 
     'required' => true, 
     'filters' => array(
      //... 
     ) 
     'validators' => array(
      //... 
     ) 
    ), 
    'street' => array(
     'name' => 'street', 
     'required' => true, 
     'filters' => array(
      //... 
     ) 
     'validators' => array(
      //... 
     ) 
    ), 
    // 'type' key necessary for reusing this input filter in other configs 
    'type' => 'Zend\InputFilter\InputFilter' 
), 


'input_filter_specs' => array(
    // The key for your address if you also want to be able to use it independently 
    'Application\InputFilter\Address'=> $addressInputFilter, 
    // The key and config for your other resource containing a nested address 
    'Application\InputFilter\ItemContainingAddress'=> array(
     'address' => $addressInputFilter, 
     'amount' => array(
      'name' => 'amount', 
      'required' => true, 
      'filters' => array(
       //... 
      ), 
      'validators' => array(
       //... 
      ) 
     ) 
     //... your other fields 
    ) 
) 
+0

這至少會允許我應用過濾器和驗證程序,到目前爲止確實如此。但它並沒有使用apigility ui在文檔和混淆方面給出的功能。經過一些更多的研究後,恐怕這是不可能的。也許這是Github項目的時間...... :) – sedegu 2014-12-12 13:28:11

1

從張伯倫的回答開始,我發現下面的代碼工作,以及:

# file path: /module/MyApi/config/module.config.php 

// some other stuff 

    'MyApi\\V1\\Rest\\MyRestService\\Validator' => array(
     'address' => array(
      0 => array(
       'name'  => 'name', 
       'required' => true, 
       'filters' => array(), 
       'validators' => array(), 
      ), 
      1 => array(
       'name'  => 'street', 
       'required' => true, 
       'filters' => array(), 
       'validators' => array(), 
      ), 
      'type' => 'Zend\InputFilter\InputFilter' 
     ), 
     'amount' => array(
      'name'  => 'amount', 
      'required' => true, 
      'filters' => array(), 
      'validators' => array() 
     ) 

address如通過我得到的唯一的問題是一個字段(字符串或數字)而不是數組或對象。在這種情況下Apigility拋出異常:

的Zend \ InputFilter輸入\異常\ InvalidArgumentException:Zend的\ InputFilter輸入\ BaseInputFilter ::使用setData期望的陣列或Traversable的一個參數;在線路接收到的字符串中/var/www/api/vendor/zendframework/zendframework/library/Zend/InputFilter/BaseInputFilter.php 175

添加address作爲更簡單的(必需的)字段避免了異常,但隨後無論我們將address作爲namestreet或虛擬字符串的數組傳遞,Apigility沒有任何區別。