Cómo obtener valores de formulario en el controlador Symfony2

81

Estoy usando un formulario de inicio de sesión en Symfony2 con el siguiente código de controlador

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()));
}

Pero recibo la siguiente advertencia:

Advertencia: array_replace_recursive () [function.array-replace-recursive]: El argumento n. ° 1 no es una matriz en \ vendor \ symfony \ src \ Symfony \ Component \ Form \ Form.php línea 593 500 Error interno del servidor - ErrorException

¿Puede alguien ayudarme a comprender qué es incorrecto y cómo puedo solucionarlo? Gracias.

Actualización: el archivo twig es algo como esto:

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

Aquí está la función en el tipo de formulario

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

Aquí está la ruta:

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

Respuestas:

99

Simplemente :

$data = $form->getData();
Hubert Perron
fuente
1
Buena respuesta - RE: respuestas a continuación. Symfony a menudo permite muchas formas de obtener resultados similares. Siempre es bueno investigar "Mejores prácticas" cuando se buscan soluciones SF.
JustinP
8
Para nuevas versiones: $ data = $ form-> all ();
Gmajoulet
92

Ninguno de los anteriores funcionó para mí. Esto funciona para mi:

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

Espero que ayude.

pkout
fuente
2
Hmmm extraño, lo hice funcionar con $ request-> request-> get ('username'); ¿Pasó el objeto de solicitud como parámetro a la acción? Y también debe incluir la Clase de solicitud en lo anterior.
VishwaKumar
59

En Symfony 2 (para ser más específico, la versión 2.3) puedes obtener los datos de un campo por

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

o puede enviar todos los datos

$data = $form->getData();

donde '$ data' es una matriz que contiene los valores de sus campos de formulario.

Albert
fuente
20

En Symfony> = 2.3, puede obtener el valor de campos individuales con:

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

Por otro lado, puedes usar:

$data = $form->getData();

PERO esto te daría dos cosas diferentes:

  • la entidad con valores poblados por el formulario, si su formulario tiene la data-classopción habilitada (por lo que está vinculado a una entidad) esto excluirá cualquier campo con la 'mapping' => falseopción

  • de lo contrario, una matriz con todos los campos del formulario

Vaquero
fuente
18

Si tiene campos adicionales en el formulario que no están definidos en Entity, $form->getData()no funcionan, una forma podría ser esta:

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

O bien:

$form->get('foo')->getData();
Saman Mohamadi
fuente
¡Gracias! ¡Salvaste mi día!
¡Gracias! Esto ayudó mucho.
madshvero
si necesita el ID de la consulta si es un objeto, puede ejecutar el siguiente comando: $ formulario-> get ('foo') -> getData () -> getId ();
juanitourquiza
Realmente aprecio tu respuesta, fue realmente útil.
Ivan Franco
5

En los formularios de Symfony , hay dos tipos diferentes de transformadores y tres tipos diferentes de datos subyacentes: ingrese la descripción de la imagen aquí En cualquier formulario, los tres tipos diferentes de datos son:

  • Datos del modelo

    Estos son los datos en el formato utilizado en su aplicación (por ejemplo, un objeto Issue). Si llama Form::getData()o Form::setData(), está tratando con los datos del "modelo".

  • Datos normativos

    Esta es una versión normalizada de sus datos y, por lo general, es la misma que los datos de su "modelo" (aunque no en nuestro ejemplo). No se suele utilizar directamente.

  • Ver datos

    Este es el formato que se usa para completar los campos del formulario. También es el formato en el que el usuario enviará los datos. Cuando llama Form::submit($data), los $ datos están en el formato de datos "ver".

Los dos tipos diferentes de transformadores ayudan a convertir hacia y desde cada uno de estos tipos de datos:

  • Transformadores modelo :

    transform(): "datos del modelo" => "datos de la norma"
    reverseTransform(): "datos de la norma" => "datos del modelo"

  • Ver transformadores :

    transform(): "norm data" => "ver datos"
    reverseTransform(): "ver datos" => "norm data"

El transformador que necesita depende de su situación.

Para usar el transformador de vista, llame addViewTransformer().


Si desea obtener todos los datos del formulario:

$form->getData();

Si busca un campo de formulario específico (por ejemplo first_name):

$form->get('first_name')->getData();
Pmpr
fuente
4

Lo tengo funcionando con esto:

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

    // Do something with the post data
}

¡También debe tener la solicitud Request $ como parámetro en la función! Espero que esto ayude.

VishwaKumar
fuente
Si su formulario no se genera con el generador de formularios sf2, solo esto le mostrará el valor del formulario, no otras soluciones. +1 compañero
Nikhil Chaudhary
4

Creo que para obtener los datos de la solicitud, vinculados y validados por el objeto de formulario, debe usar este comando:

$form->getViewData();
$form->getClientData(); // Deprecated since version 2.1, to be removed in 2.3.
Chicna
fuente
Esto es lo que estaba buscando. El proyecto en el que estoy trabajando está en Symfony 2.0 y no se puede actualizar.
Naomi
3
private function getFormDataArray($form)
{
    $data = [];
    foreach ( $form as $key => $value) {
        $data[$key] = $value->getData();
    }
    return $data;
}
viciouskinid
fuente
Si su formulario tiene subformularios, este código debería ser como:$data[$key] = is_object($value->getData()) ? $this->getFormDataArray($value) : $value->getData();
Aliance
2

Si está utilizando la administración de seguridad de Symfony 2, no necesita obtener valores publicados, solo necesita administrar la plantilla de formulario (consulte la documentación ).

Si no está utilizando la gestión de seguridad de Symfony 2, le recomiendo encarecidamente que la utilice. Si no quiere o no puede, ¿puede darnos las LoginTypefuentes de?

BlackCharly
fuente
Gracias @BlackCharly Estoy empezando a leer la documentación. También he actualizado el código para darle al lector total claridad con el mismo. Aprecio tu ayuda.
VishwaKumar
1

Si es Symfony 4 o 5, simplemente use este código (donde nombre es el nombre de su campo):

$request->request->get('name');
Ebenezer Nikabou
fuente
0

Para los campos de formulario no asignados, uso $ formulario-> get ('inputName') -> getViewData ();

Strabek
fuente