2

ネストされたデータの検証について、1 つ小さな質問がありjsonます。たとえば、次のようなPATCHリクエストがあります。

{
    "awesome": "yes",
    "myObject": {
        "some_property": "Text Example value",
        "another_property": "1965"
    }
}

some_propertyこのネストされたデータにフィルターとバリデーターを設定する適切な方法とおそらく正しい方法は何another_propertyですか?

答えてくれてどうもありがとう

4

2 に答える 2

8

私はこの答えがかなり遅いことを知っています。私は同じ問題に出くわしました(Apigilityとは関係ありません)。InputFilter多くの試行錯誤の後、ネストされたフィールド/コレクションと名前付きのキーの検証に関する完全に機能する仕様を見つけましたtype。他の人がこれを見つけた場合に参照できるように、ここに追加します (こんにちは、未来の私)。

ネストされたオブジェクト

完全を期すために追加して、すでにWiltによって回答されています。

$data = [
    'root-key' => [
        'sub-key' => 'my-value',
        'sub-key2' => 'my-other-value',
    ],
    'simple-key' => 'simple-value'
];

'input_filter_specs' => [
    'my-filter' => [
        'root-key' => [
            'type' => InputFilter::class,
            'sub-key' => [
                'required' => true,
                'filters' => [ /** Add filters **/ ],
                'validators' => [ /** Add validators **/],
            ],
            'sub-key2' => [
                'required' => true,
                'filters' => [ /** Add filters **/ ],
                'validators' => [ /** Add validators **/],
            ],
        ],
        'simple-key' => [
            'required' => true,
            'filters' => [ /** Add filters **/ ],
            'validators' => [ /** Add validators **/],
        ],
    ],
],

オブジェクトのコレクション

何らかの理由で、オブジェクトのコレクションを検証するための仕様が少し異なります。

$data = [
    'root-key' => [[
        'sub-key' => 'my-value',
        'sub-key2' => 'my-other-value',
    ], [
        'sub-key' => 'my-value',
        'sub-key2' => 'my-other-value',
    ]],
    'simple-key' => 'simple-value'
];

'input_filter_specs' => [
    'my-filter' => [
        'root-key' => [
            'type' => CollectionInputFilter::class,
            'required' => true,
            'input_filter' => [
                'sub-key' => [
                    'required' => true,
                    'filters' => [ /** Add filters **/ ],
                    'validators' => [ /** Add validators **/],
                ],
                'sub-key2' => [
                    'required' => true,
                    'filters' => [ /** Add filters **/ ],
                    'validators' => [ /** Add validators **/],
                ],
            ]
        ],
        'simple-key' => [
            'required' => true,
            'filters' => [ /** Add filters **/ ],
            'validators' => [ /** Add validators **/],
        ],
    ],
],

制限の回避type/ フィルター仕様の再利用

キーを使用してtype、入力フィルターのタイプを指定できます (前の 2 つの例で行ったように)。ただし、指定されたフィルターは暗黙的に入力フィルターでもあり、タイプとしても指定できることを知っている人はほとんどいません。これにより、指定したフィルターを他のフィルター内で再利用したり、小さなフィルターから複雑なフィルターを構成したりできます。指定した入力フィルタの名前を として渡すだけtypeです。

$data = [
    'root-key' => [
        'sub-key' => 'my-value',
        'sub-key2' => 'my-other-value',
    ],
    'simple-key' => 'simple-value'
];

'input_filter_specs' => [
    'root-key-filter' => [
        'sub-key' => [
            'required' => true,
            'filters' => [ /** Add filters **/ ],
            'validators' => [ /** Add validators **/],
        ],
        'sub-key2' => [
            'required' => true,
            'filters' => [ /** Add filters **/ ],
            'validators' => [ /** Add validators **/],
        ],
    ],
    'my-filter' => [
        'root-key' => [
            'type' => 'root-key-filter',
        ],
        'simple-key' => [
            'required' => true,
            'filters' => [ /** Add filters **/ ],
            'validators' => [ /** Add validators **/],
        ],
    ],
],

そうすることtypeで、新しく作成された入力フィルターで名前を使用できるようになります。

$data = [
    'root-key' => [
        'type' => 'my-value',
    ],
];

'input_filter_specs' => [
    'root-key-filter' => [
        'type' => [
            'required' => true,
            'filters' => [ /** Add filters **/ ],
            'validators' => [ /** Add validators **/],
        ],
    ],
    'my-filter' => [
        'root-key' => [
            'type' => 'root-key-filter',
        ],
    ],
],

この遅い回答がまだ誰にとっても役立つことを願っています。Wiltsの答えは確かであり、これについて正しい道を歩むことができました。

于 2017-03-09T11:23:37.383 に答える
2

フィールドセットに対してZF2で通常行うのと同じ方法で、フィルターとバリデーター構成でネストされたデータを設定できます。

return array(
    'awesome' => array(
        'name' => 'awesome',
        'required' => true,
        'filters' => array(
            //...
        ),
        'validators' => array(
            //...
        )
    ),
    'myObject' => array(
        'some_property' => array(
            'name' => 'some_property',
            'required' => true,
            'filters' => array(
                //...    
            ),
            'validators' => array(
                //...
            )
        ),
        'another_property' => array(
            'name' => 'another_property',
            'required' => true,
            'filters' => array(
                //...    
            ),
            'validators' => array(
                //...
            )
        ),
        // Type key necessary for nested fields
        'type' => 'Zend\InputFilter\InputFilter'
    )
);

詳細と ZF コンテンツ検証の構成方法については、StackOverfow に関する別の質問 (こちら) またはContent-Validation モジュールのドキュメント (こちら) を確認してください

于 2015-04-16T12:25:30.257 に答える