3

敏捷性リソースへの POST リクエストでネストされた/複雑な値を処理する良い方法を考えています。

たとえば、注文には、注文を作成するために使用される単一の POST 要求に注文項目のコレクションが含まれる場合があります。order と order-item の両方がリソースとして存在します。ただし、注文エンティティと注文アイテム エンティティを作成するリクエストは 1 つだけにしたいと考えています。リソースでそれを処理することは問題ではありませんが、apigiliy UI を使用して、または構成を使用して、そのリソースを構成する方法 (注文場所と呼びましょう) を疑問に思います。バリデーターとフィルターの適用は、アジリティの重要な機能の 1 つであり、複雑なリクエスト データに対しても、引き続き使用したいと考えています。

質問する前に、アンダースコアを使用して値のスコープを区切ります。たとえば、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}
    ...
]
}
4

2 に答える 2

3

Wilt の回答から始めて、次のコードも同様に機能することがわかりました。

# 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\Exception\InvalidArgumentException: Zend\InputFilter\BaseInputFilter::setData には、配列または Traversable 引数が必要です。/var/www/api/vendor/zendframework/zendframework/library/Zend/InputFilter/BaseInputFilter.php の 175 行目に文字列を受け取りました

さらに単純な (必須) フィールドとして追加すると、例外は回避されますが、Apigility では、 andまたはダミー文字列の配列としてaddress渡すかどうかに違いは見られません。addressnamestreet

于 2015-02-11T15:27:56.127 に答える
2

モジュールを使用している場合は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
    )
)
于 2014-12-08T09:20:56.493 に答える