Symfony2 컨트롤러에서 양식 값을 얻는 방법


81

다음 컨트롤러 코드로 Symfony2에서 로그인 양식을 사용하고 있습니다.

public function loginAction(Request $request)
{
    $user = new SiteUser();
    $form = $this->createForm(new LoginType(), $user);


    if ($request->getMethod() == 'POST') {
        $form->bindRequest($request);
        $data = $form->getValues();
        // Need to do something with the data here
    }

    return $this->render('GDSiteBundle::header.html.twig', array('form' => $form->createView()));
}

하지만 다음과 같은 경고가 표시됩니다.

경고 : array_replace_recursive () [function.array-replace-recursive] : 인수 # 1은 \ vendor \ symfony \ src \ Symfony \ Component \ Form \ Form.php 라인 593 500 내부 서버 오류-ErrorException의 배열이 아닙니다.

누군가가 내가 무엇이 잘못되었는지 이해하도록 도울 수 있으며 어떻게 해결할 수 있습니까? 감사.

업데이트 : twig 파일은 다음과 같습니다.

<div class="form">
    {{ form_errors(form) }}
    <form action="{{ path('site_user_login') }}" method="POST" {{ form_enctype(form) }}>
        <div class="level1">
            {{ form_row(form.username) }}
            <a href="javascript:void(0)" id="inscription">{% trans %}Registration{% endtrans %}</a>
        </div>
        <div class="level2">
            {{ form_row(form.pwd_hash) }}
            <div class="forget_pass"><a href="#" id="frgt">{% trans %}Forgot Password ?{% endtrans %}</a></div>
        </div>
        <input type="submit" class="submit" name="login" value/>
        <div class="clr"></div>
    </form>
</div>

다음은 양식 유형의 기능입니다.

public function buildForm(FormBuilder $builder, array $options)
{
    $builder->add('username', 'text', array('label' => 'Username : '));
    $builder->add('pwd_hash','password', array('label' => 'Password : '));
}

경로는 다음과 같습니다.

site_user_login:
    pattern: /{_locale}/login
    defaults: {_controller: GDSiteBundle:SiteUser:login}

답변:


99

간단히 :

$data = $form->getData();

1
좋은 답변-RE : 아래 답변. Symfony는 종종 유사한 결과를 얻을 수있는 여러 방법을 허용합니다. SF 솔루션을 찾을 때 항상 "모범 사례"를 조사하는 것이 좋습니다.
JustinP

8
새 버전의 경우 : $ data = $ form-> all ();
Gmajoulet 2014-08-11

92

위의 어느 것도 나를 위해 일하지 않았습니다. 이것은 나를 위해 작동합니다.

$username = $form["username"]->getData();
$password = $form["password"]->getData();

도움이되기를 바랍니다.


2
이상하게도 $ request-> request-> get ( 'username'); 요청 개체를 작업에 매개 변수로 전달 했습니까? 그리고 위의 요청 클래스도 포함해야합니다.
VishwaKumar 2012

59

Symfony 2 (더 구체적으로 말하자면 2.3 버전)에서는 다음과 같이 필드의 데이터를 얻을 수 있습니다.

$var = $form->get('yourformfieldname')->getData();

또는 모든 데이터를 보낼 수 있습니다.

$data = $form->getData();

여기서 '$ data'는 양식 필드 값을 포함하는 배열입니다.


20

Symfony> = 2.3에서는 다음을 사용하여 단일 필드의 값을 가져올 수 있습니다.

$var = $form->get('yourformfieldname')->getData();

반면에 다음을 사용할 수 있습니다.

$data = $form->getData();

그러나 이것은 두 가지 다른 것을 얻을 것입니다.

  • 양식에 data-class옵션이 활성화 되어있는 경우 양식에 의해 채워진 값이있는 엔티티 (따라서 엔티티에 바인딩 됨) 이 것 제외 어떤 필드 'mapping' => false옵션

  • 그렇지 않으면 모든 양식의 필드가있는 배열


18

Entity에 정의되지 않은 양식에 추가 필드가 있고 $form->getData()작동하지 않는 경우 한 가지 방법은 다음과 같습니다.

$request->get("form")["foo"] 

또는 :

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

감사합니다! 당신은 내 하루를 구했습니다!

감사합니다! 이것은 많은 도움이되었습니다.
madshvero

객체 인 경우 쿼리의 ID가 필요한 경우 다음 명령을 실행할 수 있습니다. $ form-> get ( 'foo')-> getData ()-> getId ();
juanitourquiza

답변 해 주셔서 감사합니다. 정말 도움이되었습니다.
Ivan Franco

5

Symfony 양식 에는 두 가지 유형의 변환기 와 세 가지 유형의 기본 데이터가 있습니다. 여기에 이미지 설명 입력 어떤 양식에서든 세 가지 유형의 데이터는 다음과 같습니다.

  • 모델 데이터

    이것은 애플리케이션에서 사용되는 형식의 데이터입니다 (예 : Issue 개체). 당신이 호출하는 경우 Form::getData()또는 Form::setData(), 당신은 "모델"데이터를 처리하고 있습니다.

  • 규범 데이터

    이것은 데이터의 정규화 된 버전이며 일반적으로 "모델"데이터와 동일합니다 (이 예에서는 제외됨). 일반적으로 직접 사용되지 않습니다.

  • 데이터보기

    양식 필드 자체를 채우는 데 사용되는 형식입니다. 또한 사용자가 데이터를 제출하는 형식이기도합니다. 를 호출 할 때 Form::submit($data)$ data는 "view"데이터 형식입니다.

두 가지 유형의 변환기는 다음과 같은 각 유형의 데이터를 변환하는 데 도움이됩니다.

  • 모델 변압기 :

    transform(): "모델 데이터"=> "노름 데이터"
    reverseTransform(): "노름 데이터"=> "모델 데이터"

  • 변압기보기 :

    transform(): "표준 데이터"=> "데이터보기"
    reverseTransform(): "데이터보기"=> "표준 데이터"

필요한 변압기는 상황에 따라 다릅니다.

뷰 변환기를 사용하려면을 호출하십시오 addViewTransformer().


모든 양식 데이터를 얻으려면 :

$form->getData();

특정 양식 필드 뒤에있는 경우 (예 first_name:) :

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


4

나는 이것에 의해 작동하게했다.

if ($request->getMethod() == 'POST') {
    $username = $request->request->get('username');
    $password = $request->request->get('password');

    // Do something with the post data
}

함수의 매개 변수로 Request $ request가 있어야합니다! 도움이 되었기를 바랍니다.


양식 작성기가 sf2 양식 작성기를 사용하여 생성되지 않는 경우 다른 솔루션이 아닌 양식 값만 표시됩니다. +1 메이트
Nikhil Chaudhary 2015

4

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

$form->getViewData();
$form->getClientData(); // Deprecated since version 2.1, to be removed in 2.3.

이것이 제가 찾던 것입니다. 내가 작업중인 프로젝트는 심포니 2.0에 있으며 업데이트 할 수 없습니다.
Naomi

3
private function getFormDataArray($form)
{
    $data = [];
    foreach ( $form as $key => $value) {
        $data[$key] = $value->getData();
    }
    return $data;
}

양식에 하위 양식이있는 경우이 코드는 다음과 같아야합니다.$data[$key] = is_object($value->getData()) ? $this->getFormDataArray($value) : $value->getData();
Aliance

2

Symfony 2 보안 관리를 사용하는 경우 게시 된 값을 가져올 필요가 없으며 양식 템플릿 만 관리하면됩니다 ( 설명서 참조 ).

Symfony 2 보안 관리를 사용하지 않는 경우 사용하는 것이 좋습니다. 원하지 않거나 할 수없는 경우 LoginType출처 를 알려주 시겠습니까?


@BlackCharly 감사합니다. 문서를 읽기 시작했습니다. 또한 독자에게 완전히 명확하게 코드를 업데이트했습니다. 당신의 도움을 주셔서 감사합니다.
VishwaKumar

1

Symfony 4 또는 5 인 경우 다음 코드를 사용하십시오 (여기서 이름은 필드 이름 임).

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

0

매핑되지 않은 양식 필드의 경우 $ form-> get ( 'inputName')-> getViewData ();

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.