2014-12-04 7 views
0

나는 apigility 리소스에 대한 POST 요청에서 중첩 된/복잡한 값을 처리하는 좋은 방법에 대해 생각 해왔다.POST 요청의 중첩 매개 변수/값

예를 들어, 주문에는 주문을 생성하는 데 사용되는 요청 된 단일 POST의 주문 항목 모음이 포함될 수 있습니다. 주문과 주문 항목 모두 자원으로 존재합니다. 그러나 주문 항목을 생성하고 항목 항목을 주문하는 요청을 하나만 갖고 싶습니다. 리소스에서 처리하는 것은 문제가되지 않지만, apigiliy UI를 사용하여 리소스를 구성하는 방법 (또는 주문 장소라고 부름)을 설정하는 것이 궁금합니다. 또는 불가능할 경우 구성을 사용하십시오. validator와 필터를 적용하는 것은 apigility의 주요 특징 중 하나이며 복잡한 요청 데이터에 대해서도 계속 사용하고 싶습니다.

그리고 물음표 앞에 밑줄을 사용하여 값 범위를 구분하십시오. 예를 들어 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} 
    ... 
] 
} 
+0

서버에 샘플 JSON을 보낼 수 있습니까? 바라기를 원하는 방식으로 구조화되어 있습니다. – Boris

답변

1

당신은 당신이 중첩 된 자원에 대한 입력 필터를 구성 할 수 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 
    ) 
) 
+0

적어도 필터와 유효성 검사기를 적용 할 수 있습니다. 이것은 지금까지는 사실입니다. 그러나 문서화와 모집에 관해서는 유순함이 제공하는 기능을 사용하지 않습니다. 더 많은 연구가 끝나면 나는 그것이 가능하지 않을까 걱정됩니다. 어쩌면 그것은 github 프로젝트를위한 시간입니다 ... :) – sedegu

1

, 다음 코드뿐만 아니라 작동하는 것으로 나타났습니다 : address이로 전달 될 때

# 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() 
     ) 

내가 할 수있는 유일한 문제는 배열이나 객체보다는 필드 (문자열 또는 숫자). 이 경우 Apigility 예외가 발생 :

젠드 \ InputFilter \ 예외 \의 InvalidArgumentException가

: 젠드 \ InputFilter \ BaseInputFilter가 :: 사항 setData 배열에 이동 또는 인수를 기대한다; 라인 /var/www/api/vendor/zendframework/zendframework/library/Zend/InputFilter/BaseInputFilter.php의 문자열을 수신 한 또 다른 간단한 (필수) 필드로 address 추가 175

예외를 피할 그런데 우리가 namestreet 또는 더미 문자열의 배열로 address을 전달했는지 여부에 상관없이 기쁨은 아무런 차이가 없습니다.