Я знаю, что этот ответ довольно поздний. Я наткнулся на ту же проблему (не связанную с Apigility). После многих попыток ошибки & я нашел полностью действующую спецификацию InputFilter
для проверки вложенных полей/коллекций, а также ключей с именем type
. Добавляя это здесь для справки, другие должны найти это (здравствуйте будущее меня).
Вложенные объекты
Уже ответил Уилт, добавив для полноты картины.
$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
, можно указать тип входного фильтра (как это сделано в двух примеры до). Однако немногие знают, что указанные фильтры неявно являются входными фильтрами, а также могут быть указаны как тип тоже. Это позволяет повторно использовать указанные фильтры в других фильтрах и создавать сложные фильтры из меньших. Просто передайте имя указанного входного фильтра как 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',
],
],
],
Я надеюсь, что этот поздний ответ еще полезен для тех, кто там. Уилтс ответил, что это было верно, и привел меня на правильный путь.
Это правильный ответ, но он представляет собой ошибочную реализацию, поскольку он запрещает иметь вложенное поле с именем 'type'. –
@QuolonelQuestions Я знаю, но это ошибка реализации/архитектуры zend. Я сделал отчет о проблеме ** [здесь, на GitHub] (https://github.com/zendframework/zend-inputfilter/issues/81) **. Надеюсь, что они что-то сделают в ZF3. Может быть, хорошо оставить комментарий там, чтобы побудить их работать над этим. Это очень раздражает. – Wilt