Как получить значения формы в контроллере Symfony2

76

Я использую форму входа на 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}
Теги:
forms

12 ответов

86
Лучший ответ

Просто:

$data = $form->getData();
  • 1
    Хороший ответ - RE: ответы ниже. Symfony часто позволяет по многим причинам получить похожие результаты. Всегда полезно изучить «Best Practices» при поиске решений SF.
  • 8
    Для новых версий: $ data = $ form-> all ();
90

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

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

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

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

В 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

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

15

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

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

Или:

$form->get('foo')->getData();
  • 0
    Спасибо! Ты спас мой день!
  • 0
    Спасибо! Это очень помогло.
Показать ещё 1 комментарий
5

В формах Symfony есть два разных типа преобразователей и три разных типа базовых данных: Изображение 7212 В любой форме три разных типа данных:

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

    Это данные в формате, используемом в вашем приложении (например, объект 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

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

$form->getViewData();
$form->getClientData(); // Deprecated since version 2.1, to be removed in 2.3.
  • 0
    Это то, что я искал. Проект, над которым я работаю, находится в Symfony 2.0 и не может быть обновлен.
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();
3

Я заработал:

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

    // Do something with the post data
}

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

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

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

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

  • 0
    Спасибо @BlackCharly, я начинаю читать документацию. Я также обновил код, чтобы дать читателю полную ясность с тем же. Ценю твою помощь.
0

Чтобы получить данные определенного поля,

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

Или для всех данных формы

$form->getData();

Ссылка на документы: https://symfony.com/doc/2.7/forms.html

0

Для не отображенных полей формы я использую $form-> get ('inputName') → getViewData();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню