私はこの答えがかなり遅いことを知っています。私は同じ問題に出くわしました(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の答えは確かであり、これについて正しい道を歩むことができました。