2012-01-24 2 views
67

Я использую форму входа на Symfony2 с помощью следующего кода контроллераКак получить значение формы в контроллере 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 замены рекурсией]: Аргумент # 1 не является массивом в \ поставщика \ Symfony \ SRC \ Symfony \ Component \ Form \ form.php линия 593 500 Внутренняя ошибка сервера - ErrorException

Может кто-нибудь помочь мне понять, что неправильно, и как я могу это исправить? Благодарю.

Update: Файл веточка что-то вроде этого:

<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} 

ответ

83

Просто:

$data = $form->getData(); 
+1

Nice Answer - RE: ниже ответы. Symfony часто допускает множество способов получения аналогичных результатов. Всегда полезно исследовать «лучшие практики» при поиске решений SF. – JustinP

+8

Для новых версий: $ data = $ form-> all(); – Gmajoulet

2

Если вы используете управление безопасностью Symfony 2, вам не нужно получать опубликованные значения, вам нужно только управлять rm (см. documentation).

Если вы не используете управление безопасностью Symfony 2, я советую вам его использовать. Если вы не хотите или не можете, можете ли вы предоставить нам источники LoginType?

+0

Благодаря @BlackCharly я начинаю прочитайте документацию. Я также обновил код, чтобы дать читателю полную ясность с тем же. Ценю вашу помощь. – VishwaKumar

2

Я получил это работает на это:

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

    // Do something with the post data 
} 

Вам необходимо иметь $ запрос запрос в качестве параметра в функции тоже! Надеюсь, это поможет.

+0

, если ваша форма не генерируется с использованием sf2 form builder, тогда только это покажет вам значение формы, а не другие решения. +1 mate –

86

Ничего из вышеперечисленного не работало для меня. Это работает для меня:

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

Надеюсь, это поможет.

+1

Хм, странно, я получил его, работая с $ request-> request-> get ('username'); Вы передали объект запроса в качестве параметра для действия? И вы должны включить класс запроса также в вышеприведенное. – VishwaKumar

4

Я думаю, что для того, чтобы получить данные запроса, связанные и проверены объекта формы, вы должны использовать эту команду:

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

Это то, что я искал. Проект, над которым я работаю, находится в symfony 2.0 и не может быть обновлен. – Naomi

52

В Symfony 2 (к более конкретно, версия 2,3) вы можете получить данные из поля по

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

или вы можете получить все данные, передаваемые

$data = $form->getData(); 

где '$ data' - это массив, содержащий значения полей формы.

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

Если ваша форма имеет подчиненные формы, этот код должен выглядеть следующим образом: '$ data [$ key] = is_object ($ value-> getData())? $ this-> getFormDataArray ($ value): $ value-> getData(); ' – Aliance

16

В Symfony> = 2.3, вы можете получить значение отдельных полей с:

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

С другой стороны, вы можете использовать:

$data = $form->getData(); 

НО это получит вам две разные вещи:

  • объект с значениями, заполненными формой, если в вашей форме включена опция data-class (поэтому она привязана к сущности); это исключает любое поле с опцией 'mapping' => false

  • в противном случае, массив со всеми полей формы в

13

Если у вас есть дополнительные поля в форме, которые не определены в Сущности, $form->getData() не работа, один из способов может быть такой:

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

Или:

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

Спасибо! Ты спас мой день! – Crone

+0

Спасибо! Это очень помогло. – madshvero

+0

, если вам нужен идентификатор запроса, если это объект, вы можете выполнить следующую команду: $ form-> get ('foo') -> getData() -> getId(); – juanitourquiza

4

В Symfony forms, существуют два различных типа transformers и три различных типа основных данных: enter image description here В любом виде, три различных типа данных являются:

  • модели данных

    Это данные в формате, используемом в вашем приложении (например, объект «Проблема»). Если вы звоните Form::getData() или Form::setData(), вы имеете дело с данными «модели».

  • Norm данные

    Это нормированная версия данных и обычно такой же, как ваши данные «модель» (хотя и не в нашем примере). Он обычно не используется напрямую.

  • Просмотр данные

    Это формат, который используется для заполнения формы самих полей. Это также формат, в котором пользователь будет отправлять данные. Когда вы вызываете Form::submit($data), данные $ находятся в формате данных «вид».

Два различных типов трансформаторов помочь преобразовать в и из каждого из этих типов данных:

  • модели трансформаторов:

    transform(): "модель данных" => " нормативные данные "
    reverseTransform():" данные нормы "=>" данные модели "

  • Посмотреть трансформаторы:

    transform(): "норма данных" => "Просмотр данных"
    reverseTransform(): "Просмотр данных" => "данные нормы"

Какой трансформатор вам нужен, зависит от ваша ситуация.

Чтобы использовать трансформатор вида, позвоните по телефону addViewTransformer().


Если вы хотите, чтобы получить все данные формы:

$form->getData(); 

Если вы после определенного поля формы (например first_name):

$form->get('first_name')->getData(); 
Смежные вопросы