Symfony2 요청 객체의 POST 값에 액세스


93

좋습니다. 이것은 초보자 질문이지만 어디에서도 답을 찾을 수 없습니다. Symfony2의 컨트롤러에서 내 양식 중 하나에서 POST 값에 액세스하고 싶습니다. 컨트롤러에는 다음이 있습니다.

public function indexAction()
{ 
    $request = $this->get('request');
    if ($request->getMethod() == 'POST') {
        $form = $this->get('form.factory')->create(new ContactType());
        $form->bindRequest($request);
        if ($form->isValid()) {
            $name_value = $request->request->get('name');

불행히도 $name_value아무것도 반환하지 않습니다. 내가 뭘 잘못하고 있죠? 감사!

답변:


99

심포니 2.2

이 솔루션은 2.3부터 사용되지 않으며 3.0에서 제거됩니다. 문서를 참조하십시오.

$form->getData();

양식 매개 변수에 대한 배열을 제공합니다.

symfony2 책 162 페이지 에서 (12 장 : 양식)

[...] 때로는 클래스없이 양식을 사용하고 제출 된 데이터의 배열을 다시 가져오고 싶을 수 있습니다. 이것은 실제로 정말 쉽습니다.

public function contactAction(Request $request) {
  $defaultData = array('message' => 'Type your message here');
  $form = $this->createFormBuilder($defaultData)
  ->add('name', 'text')
  ->add('email', 'email')
  ->add('message', 'textarea')
  ->getForm();
  if ($request->getMethod() == 'POST') {
    $form->bindRequest($request);
    // data is an array with "name", "email", and "message" keys
    $data = $form->getData();
  }
  // ... render the form
}

다음과 같이 요청 객체를 통해 직접 POST 값 (이 경우 "이름")에 액세스 할 수도 있습니다.

$this->get('request')->request->get('name');

그러나 대부분의 경우 getData () 메서드를 사용하는 것이 더 나은 선택입니다. 양식 프레임 워크에 의해 변환 된 데이터 (일반적으로 객체)를 반환하기 때문입니다.

양식 토큰에 액세스 하려면 배열에서 요소를 제거 $postData = $request->request->get('contact');하기 때문에 Problematic의 답을 사용해야합니다. getData()


심포니 2.3

2.3부터 다음 handleRequest대신 사용해야 합니다 bindRequest.

 $form->handleRequest($request);

문서 참조


4
이것은 훌륭하고 지금이 최고의 대답입니다. $ form-> getData ()가 존재하지 않았거나 질문했을 때 문서화되지 않았습니다.
Acyra 2011

4
요청 데이터를 최신 버전의 양식에 바인딩하려면 $ form-> handleRequest ($ request); $ form-> submit ($ request); 대신 나는 생각한다. 자세한 내용 symfony.com/doc/2.3/book/forms.html#handling-form-submissions
adridev

127

양식 게시 값은 요청의 양식 이름으로 저장됩니다. 예를 들어 getName()"contact"를 반환하도록 ContactType () 메서드를 재정의 한 경우 다음을 수행합니다.

$postData = $request->request->get('contact');
$name_value = $postData['name'];

여전히 문제가있는 경우 일을하려고 var_dump()$request->request->all()모든 게시물의 값을 볼 수 있습니다.


2
감사합니다. 위해서 var_dump 도움이, 나는 폼 데이터 예를 들어 $ postData를 = $ 요청 -> 요청 -> GET ( 'acme_somebundle_contact_type')를 복구하기 위해 전체 이름으로이 공격 결국
Acyra

1
아래의 timaschew의 답변을 참조하십시오. 이것이 요청되었으므로 Symfony2는 새로운 메소드를 추가했습니다. $ form-> getData ();
Acyra 2011

2
를 재정의 getName()한 경우 이름을 하드 코딩하지 않는 것이 좋습니다.$request->request->get($form->getName());
meze

감사합니다 .. 많은 시간을 절약했습니다. :) 건배 !!
Anjana Silva

38

나를 위해 일한 것은 이것을 사용하는 것입니다.

$data = $request->request->all();
$name = $data['form']['name'];

이 문제적인 언급, +가 @meze의 코멘트를 볼 것입니다
phpsherpa

17

방법에는 한 가지 트릭이 있습니다 ParameterBag::get(). 추가 변수없이 $deep매개 변수 를 설정 true하고 필요한 깊은 중첩 값에 액세스 할 수 있습니다 .

$request->request->get('form[some][deep][data]', null, true);

또한 기본값 ( get()메소드의 두 번째 매개 변수 )을 설정할 수 있으므로 중복 isset($form['some']['deep']['data'])호출을 피할 수 있습니다 .


세 번째 매개 변수는 더 이상 사용되지 않고 3.0에서 제거되었습니다. 참고 : 깊은 항목 찾기는 3.0에서 제거 될 버전 2.8부터 더 이상 사용되지 않습니다. : github.com/symfony/symfony/blob/…
AL

8

컨트롤러에서 필드 데이터에 액세스 할 수 있습니다. 목록 12-34

$form->get('dueDate')->getData();

또한 매핑되지 않은 필드의 데이터를 직접 수정할 수도 있습니다. 예제 12-35

$form->get('dueDate')->setData(new \DateTime());

164 쪽 symfony2 book (2013 년 10 월 9 일 생성)


7

다음과 같은 방법으로 멀티 파트 게시 요청에 대한 ticketNumber 매개 변수에 액세스합니다.

$data = $request->request->all();
$ticketNumber = $data["ticketNumber"];

1

양식 객체에 의해 바인딩되고 유효성이 검사되는 요청 데이터를 얻으려면 다음을 사용해야한다고 생각합니다.

$form->getClientData();


7
getClientData는 더 이상 사용되지 않습니다. 사용 GetData의, getViewData, getNormData는 ... 폼 구성 요소 (그들은 정말 자바 세계와 멋진의 RequestDataBinder에서 영감을 얻을합니다 ....) SF2 정말 지저분
토마스 Decaux

0

요청 데이터를 얻기위한 Symfony 문서

마지막으로, 요청 본문과 함께 전송 된 원시 데이터는 getContent ()를 사용하여 액세스 할 수 있습니다.

$ content = $ request-> getContent ();


-14

초보자라면 오픈 소스 프로젝트 인 Symfony2에 오신 것을 환영합니다. 많은 것을 배우고 싶다면 소스를 열 수 있습니다!

"Form.php"에서 :

getData () getNormData () getViewData ()

이 파일에서 자세한 내용을 찾을 수 있습니다.


항상 심포니 방법을 사용하여, $ _POST는 $ 요청 더럽
토마스 Decaux

그래 나는 설명에 좋지 않다 ^^하지만 이것은 $form->getData();내가 사람들이 게으르고 조금 생각하지 않고 해결책을 원한다는 것을 확인한 것과 똑같은 해결책입니다 ;-(
Thomas Decaux
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.