Как получить значения формы в контроллере 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-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}

Ответ 1

Просто:

$data = $form->getData();

Ответ 2

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

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

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

Ответ 3

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

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

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

$data = $form->getData();

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

Ответ 4

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

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

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

$data = $form->getData();

НО, это даст вам две разные вещи:

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

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

Ответ 5

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

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

Или:

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

Ответ 6

В формах Symfony есть два разных типа преобразователей и три разных типа базовых данных: enter image description here В любой форме три разных типа данных:

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

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

  • Норма Данных

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

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

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

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

  • Модельные трансформаторы:

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

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

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

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

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


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

$form->getData();

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

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

Ответ 7

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

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

Ответ 8

Я заработал:

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

    // Do something with the post data
}

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

Ответ 9

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

Ответ 10

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

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

Ответ 11

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

Ответ 12

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

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

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

$form->getData();

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