2014-07-18 6 views
5

저는 현재 symfony 양식을 내 게시물과 함께 작동시키고 나머지 API 엔드 포인트를 넣으려고합니다. Symfony 양식을 REST API와 함께 사용하려면 어떻게해야합니까?

현재 내가 가진 :

$request = $this->getRequest(); 
$cc = new CreditCard(); 
$form = $this->createForm(new CreditCardType(), $cc); 

$form->handleRequest($request); 

if ($form->isValid()) { 
    //... 
} 

그러나 양식이 결코 유효합니다. 문제를 살펴보면 양식의 isSubmitted 필드가 false 인 것으로 보이므로 유효성 검사를 통과하지 못합니다. 또한 이것은 api 호출이므로 creditcardtype에 false로 설정된 csrf_protection을 갖습니다. 여기

내가 사용자가 제출하는 데 어떤 데이터의 예는 다음과 같습니다

{ 
    "credit_card": { 
    "name" : "Example Name" 
    ... 
    } 
} 

나는이 게시물/넣어 요청이 제출로 등록 양식 검증을 통과해야 할 어떻게합니까? 감사.

답변

5

양식의 전체 POST 데이터 및 유효성 검사 오류뿐만 아니라 CreditCardType 클래스의 전체 코드를 제공 할 수 있다면 도움이됩니다.

어쨌든이 일이 내가 형태 실패를 제출하는 이유 것으로 확인됩니다

  • 불완전한 데이터를 제출 : 당신이 당신의 POST 요청에 결석하여 CerditCardType 양식 필드가있는 경우, 반드시 그것을 만들 'required'옵션을 false로 설정합니다.
  • 양식 이름 : 모든 필드가 양식 이름 (CreditCardType :: getName() 메서드에서 제공 한 이름)의 이름이 지정된 속성으로 둘러싸여 있는지 확인하십시오. 귀하의 경우에는 "credit_card"라고 가정합니다.
  • CreditCardType 클래스에 정의 된 필드 만 게시하십시오. 폼의 필드와 일치하지 않는 매개 변수를 게시하면 "이 폼에는 추가 필드가 없어야합니다"와 같은 유효성 검사 오류가 발생합니다.

어쨌든 더 많은 정보를 제공해 주시면 기꺼이 도와 드리겠습니다.

UPDATE :

좋아, 난 당신의 문제는 당신이 JSON 문자열로 데이터를 게시하고, 심포니는 요청의에서 디코딩해야합니다 알고하지 않기 때문에 handleRequest() 방법은 데이터를 받고되지 않은 생각 body ($ _GET 또는 $ _POST 매개 변수로 데이터가 전송 될 것으로 예상 함). 그래서 당신 스스로해야합니다. 대신 당신이 요청 내용 ($request->getContent())을 디코딩하여 당신이 얻은 데이터로 submit() 방법을 사용해야하는 handleRequest() 방법을 사용

:

$request = $this->getRequest(); 
$cc = new CreditCard(); 
$form = $this->createForm(new CreditCardType(), $cc); 

// Decode de JSON input 
$data = json_decode($request->getContent(), true); 

// Post the data to the form 
$form->submit($data); 

if ($form->isValid()) { 
    //... 
} 

는 지금 희망이 도움이!

BTW RESTful 구현에서 작업하는 경우 실제로는 FOSRestBundle 번들을 사용하는 것이 좋습니다. 그것은 당신을 위해 모든 형식 변환 논리뿐만 아니라 라우팅, 엔터티 de/serialization 등 처리 할 것입니다.

+0

내가 양식의 제출, 앞서 말했듯이 값은 false입니다. 나는 symfony의 Form 클래스에있는 submit 함수에 die 문을 넣었고 die는 결코 트리거되지 않았습니다. 또한 submit 함수는 symfony에서 유일하게 true로 설정된 집합입니다. CreditCardType은 필드를 추가하는 빌더와 정확히 같으며 getName은 'credit_card'를 반환하고 data_class는 creditcard enity로 설정됩니다. –

+0

@DerickF 죄송합니다. 나는 isSubmitted()를 isValid()와 혼동했다. 데이터를 JSON 문자열로 게시 하시겠습니까? JSON을 디코딩 한 다음 해당 객체를 양식 데이터로 사용하려면 요청의 내용을 구문 분석해야합니다. 그 경우 알려 주시면 올바른 답변으로 내 게시물을 수정할 수 있습니다! –

+0

아름답게 작동합니다! 감사! –

5

데이터가 제대로 양식에 전달되지 않습니다. 양식 이름을 키로 사용하십시오.

심포니을 사용하여 폼을 만들 때 POST ING가 ..

"your_form_name": {   // Given that you forms `getName()` 
          // returns "your_form_name" 
    "field1": "value1", 
    "field2": "value2" 
} 

는 그것이 대해 (이하 같은 키로 see github을 폼 이름을 사용 handleRequest 방법을 사용하면 때 어레이의 다음 형태를 만들 전체 코드) ..

if ('GET' === $method) { 
     if ('' === $name) { 
      $data = $_GET; 
     } else { 
      // Don't submit GET requests if the form's name does not exist 
      // in the request 
      if (!isset($_GET[$name])) { 
       return; 
      } 

      $data = $_GET[$name]; 
     } 
    } else { 
     // ... same sort of stuff for $_POST, $_FILES, etc 
    } 

    // ... 

    $form->submit($data, 'PATCH' !== $method); 

즉, 양식 이름이 포함되지 않은 배열을 제출하면 제출되지 않습니다.

오히려 양식 이름 키 등으로 데이터보다 모든 데이터를 대신 submit() 방법을 사용하여 제출하는 것 그 주위에 얻을 수있는 방법 ..

$form->submit($request->request->all()); // $_POST 

$form->submit($request->query->all());  // $_GET 
+0

my $ form-> getName()은 'credit_card'를 반환하고 외부 괄호없이 지정된 방식으로 데이터를 전달하려고 시도했지만 여전히 운이 없었습니다. –

+0

외부 중괄호가 없습니까? – qooplmao

+0

내 질문과 내가 제공하는 샘플 데이터를 참조하십시오. 나는 외부 "{}"을 제거했다. –