Как получить значения формы в контроллере 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() [функция.массив-заменить-рекурсивные]: Аргумент #1-это не массив в поставщикав Symfonyницв Symfonyкомпонентформаформа.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}
11 72

11 ответов:

просто :

$data = $form->getData();

ни один из выше работал для меня. Это работает для меня:

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

Я надеюсь, что это помогает.

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

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

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

$data = $form->getData();

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

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

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

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

$data = $form->getData();

но это вам две разные вещи:

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

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

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

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

или :

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

$form->getData();

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

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

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

$form->getViewData();
$form->getClientData(); // Deprecated since version 2.1, to be removed in 2.3.
private function getFormDataArray($form)
{
    $data = [];
    foreach ( $form as $key => $value) {
        $data[$key] = $value->getData();
    }
    return $data;
}

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

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

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

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

    // Do something with the post data
}

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

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