2015-04-16 4 views
2

У меня есть один маленький вопрос об утверждении вложенных данных json. Например, у меня есть подобный PATCH запрос, как это:Как проверить вложенные данные по методу Apigility?

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

Как правильно и, возможно, правильный путь для установки фильтров и валидаторов для этого вложенных данных some_property и another_property?

Большое спасибо за ответы

ответ

4

Я знаю, что этот ответ довольно поздний. Я наткнулся на ту же проблему (не связанную с 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', 
     ], 
    ], 
], 

Я надеюсь, что этот поздний ответ еще полезен для тех, кто там. Уилтс ответил, что это было верно, и привел меня на правильный путь.

2

Вы можете установить вложенные данные в фильтре и валидатор конфигой пути, как вы обычно делаете в ZF2 для fieldsets.

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 содержание проверки another question on StackOverfow here или Content-Validation module documentation here.

+0

Это правильный ответ, но он представляет собой ошибочную реализацию, поскольку он запрещает иметь вложенное поле с именем 'type'. –

+0

@QuolonelQuestions Я знаю, но это ошибка реализации/архитектуры zend. Я сделал отчет о проблеме ** [здесь, на GitHub] (https://github.com/zendframework/zend-inputfilter/issues/81) **. Надеюсь, что они что-то сделают в ZF3. Может быть, хорошо оставить комментарий там, чтобы побудить их работать над этим. Это очень раздражает. – Wilt

Смежные вопросы