Cómo obtener los parámetros de solicitud en symfony2


203

Soy muy nuevo en Symfony. En otros idiomas, como Java y otros, puedo usar request.getParameter('parmeter name')para obtener el valor.

¿Hay algo similar que podamos hacer con Symfony2?
He visto algunos ejemplos, pero ninguno me funciona. Supongamos que tengo un campo de formulario con el nombre de usuario . En la acción de formulario intenté usar algo como esto:

$request = $this->getRequest();
$username= $request->request->get('username'); 

También he intentado

$username = $request->getParameter('username');

y

$username=$request->request->getParameter('username');

Pero ninguna de las opciones está funcionando. Sin embargo, lo siguiente funcionó bien:

foreach($request->request->all() as $req){
    print_r($req['username']);
}

¿Dónde estoy haciendo mal al usar el getParameter()método? Cualquier ayuda será apreciada.


Tienes un error tipográfico en la línea dos: $request->request-get()debería ser $request->request->get(). ¿Podría ser eso?
halfer

he escrito lo mismo en el código. perdido aquí. lo siento por el error tipográfico aquí. aún esto no funciona.
Abdul Hamid

¿Ha (a) revisado el manual para asegurarse de que get()es el método correcto y (b) ha activado los avisos de PHP para que pueda ver si hay algún problema? (c) ¿Symfony 2 tiene una barra de herramientas de depuración como Symfony 1, para que pueda ver si ha cometido algún error?
halfer

¿Estás confundiendo nombre y nombre de usuario?
greg0ire

Respuestas:


416

El nombramiento no es tan intuitivo:

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request)
{
    // $_GET parameters
    $request->query->get('name');

    // $_POST parameters
    $request->request->get('name');

46
Es diferente de lo que usa PHP, pero en realidad tiene más sentido. $_GETlos datos son datos de la cadena de consulta (no se GETnecesita ninguna solicitud) y los $_POSTdatos son datos del cuerpo de la solicitud (tampoco tiene que ser una POSTsolicitud, podría ser PUT).
igorw

55
intentó $ request-> query-> get ('name'); Pero tampoco está funcionando.
Abdul Hamid

77
¿Cómo obtengo los parámetros de una solicitud PUT?
Tjorriemorrie

10
Nombre muy extraño aquí, seguramente $request->gety $request->postsería más simple.
crmpicco

3
el comentario de igorw aporta claridad a esta extraña convención de nombres
Dheeraj

32

Lo hago aún más simple:

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request)
{
    $foo = $request->get('foo');
    $bar = $request->get('bar');
}

Otra opción es introducir sus parámetros en la definición de su función de acción:

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request, $foo, $bar)
{
    echo $foo;
    echo $bar;
}

que luego asume que definiste {foo} y {bar} como parte de tu patrón de URL en tu archivo routing.yml:

acme_myurl:
    pattern:  /acme/news/{foo}/{bar}
    defaults: { _controller: AcmeBundle:Default:getnews }

y en el primer ejemplo, si tengo un fooparámetro tanto en la cadena de consulta como en el cuerpo POST, ¿cuál será devuelto por $request->get('foo')?
Dimitry K

1
Parece que la prioridad es GET, PATH, POST api.symfony.com/master/Symfony/Component/HttpFoundation/…
Dimitry K

Esta es la mejor respuesta
impulsado por vapor

77
No, no es. La documentación del método en sí dice que se desaconseja usarlo porque es más pesado que acceder a los parámetros GET / POST a través de sus colecciones específicas.
jurchiks

1
La respuesta es correcta $request->get('foo'); para TODAS las bolsas (el pedido es: RUTA, OBTENER, PUBLICAR). Sin embargo, $request->request->get('foo');funciona solo para la bolsa POST. Finalmente, el primero ( $request->get()) no se recomienda si sabemos dónde están los datos (GET / POST).
F2000

18

Puede usar el siguiente código para obtener sus valores de campo de formulario

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request)
{
    // retrieve GET and POST variables respectively
    $request->query->get('foo');
    $request->request->get('bar', 'default value if bar does not exist');
}

O también puede obtener todos los valores de formulario como matriz utilizando

$request->request->all()

3
$ request-> request-> all () está funcionando para mí pero algo así como $ request-> query-> get ('foo'); no está trabajando.
Abdul Hamid

13

tratar

$request->request->get('acme_demobundle_usertype')['username']

inspeccionar el nombre del atributo de su campo de formulario


1
+1, ya que creo que de todas las respuestas, solo esta realmente indica lo que no es obvio: en los casos en que haya creado sus formularios automáticamente con la ayuda del creador de formularios de Symfony, Symfony cambia el nombre del campo de formulario a algo más de lo que usted hubiera deseado. esperar. Like name = "acme_demobundle_userform [field_name]"
userfuser el

La sintaxis que mencionó aquí no funciona con php 5.3.10. ¿Cuál es la versión mínima para soportar eso?
Justinas Lelys

2
@justinasLelys try $ userType = $ request-> request-> get ('acme_demobundle_usertype'); $ username = $ userType ['nombre de usuario'];
durmiendo el

La sintaxis de @JustinasLelys es PHP 5.4
Bobina

"nombre de usuario" no se puede definir. Así que mejor verifique con "??" primero.
Viktor Sydorenko

9

Dentro de un controlador:

$request = $this->getRequest();
$username = $request->get('username');

66
En las versiones más nuevas de Symfony, $this->getRequest()está en desuso, a favor de inyectar la Solicitud en la acción del controlador, por ejemplo:public function showAction(Request $request, $id);
Adam Elsodaney

9

Sus opciones:

  1. Sencillo:
    • $request->request->get('param')( $_POST['param']) o
    • $request->query->get('param')( $_GET['param'])
  2. Buenos formularios de Symfony con toda la validación, transformación de valores y representación de formularios con errores y muchas otras características:
  3. Algo intermedio (ver ejemplo a continuación)
<?php
/**
 * @Route("/customers", name="customers")
 *
 * @param Request $request
 * @return Response
 */
public function index(Request $request)
{
    $optionsResolver = new OptionsResolver();
    $optionsResolver->setDefaults([
        'email' => '',
        'phone' => '',
    ]);
    $filter = $optionsResolver->resolve($request->query->all());

    /** @var CustomerRepository $customerRepository */
    $customerRepository = $this->getDoctrine()->getRepository('AppBundle:Customer');

    /** @var Customer[] $customers */
    $customers = $customerRepository->findFilteredCustomers($filter);

    return $this->render(':customers:index.html.twig', [
        'customers' => $customers,
        'filter' => $filter,
    ]);
}

Más sobre OptionsResolver- http://symfony.com/doc/current/components/options_resolver.html


8

Como ahora el $this->getRequest()método está en desuso, debe inyectar un Requestobjeto en la acción del controlador de esta manera:

public function someAction(Request $request)

después de eso puedes usar uno de los siguientes.

Si desea obtener datos POST de la solicitud, use lo siguiente:

$request->request->get('var_name');

pero si desea obtener datos GET de la solicitud, use esto:

$request->query->get('var_name');

6

Puedes hacerlo así:

$clientName = $request->request->get('appbundle_client')['clientName'];

A veces, cuando los atributos están protegidos, no puede tener acceso para obtener el valor del método común de acceso:

(ENVIAR)

 $clientName = $request->request->get('clientName');

(OBTENER)

$clientName = $request->query->get('clientName');

(GENÉRICO)

$clientName = $request->get('clientName');

1
Bienvenido a Stack Overflow. Formatee su respuesta para que sea más legible la próxima vez y también consulte esta página de ayuda: Cómo responder
Fabian Horlacher

¿Qué pasa si hay 2 valores después de obtener? así$clientName = $request->query->get('clientName','any');
Munkhdelger Tumenbayar

3

La mayoría de los casos, como obtener cadenas de consulta o parámetros de formulario, se tratan en las respuestas anteriores.

Cuando se trabaja con datos sin procesar, como una cadena JSON sin procesar en el cuerpo que le gustaría dar como argumento json_decode(), Request::getContent()se puede usar el método .

$content = $request->getContent();

Se puede encontrar información útil adicional sobre las solicitudes HTTP en Symfony en la documentación del paquete HttpFoundation .


1
$request = Request::createFromGlobals();
$getParameter = $request->get('getParameter');

¿Sigue siendo el camino a seguir para las funciones que no tienen el Requestparámetro? (por ejemplo, en funciones privadas de la clase de controlador)
fritzmg

1
use Symfony\Component\HttpFoundation\Request;

public function indexAction(Request $request, $id) {

    $post = $request->request->all();

    $request->request->get('username');

}

Gracias, también puedes usar el código anterior


0

Si necesita obtener el valor de una selección, puede usar:

$form->get('nameSelect')->getClientData();

0

Intenta esto, funciona

$this->request = $this->container->get('request_stack')->getCurrentRequest();

Saludos


Esto no responde a la pregunta en absoluto. La persona que hace la pregunta ya tiene acceso al objeto de solicitud.
Layton Everson

1
@LaytonEverson lo siento, pero está equivocado, su método // $ this-> getRequest () está en desuso desde 2.4, por eso no funciona, por lo que realmente no tiene acceso al objeto de solicitud;)
AchrafSoltani

Aunque no está equivocado al respecto, el autor de la pregunta se pregunta qué método recupera las variables del objeto de solicitud. @Cerad respondió esta pregunta correctamente. No solo proporcionó la forma correcta de acceder al objeto Solicitud, sino que también respondió la pregunta.
Layton Everson

0
public function indexAction(Request $request)
{
   $data = $request->get('corresponding_arg');
   // this also works
   $data1 = $request->query->get('corresponding_arg1');
}

1
Si bien este código puede responder la pregunta, sería mejor incluir algo de contexto, explicando cómo funciona y cuándo usarlo. Las respuestas de solo código no son útiles a largo plazo.
Bono

0

Para usuarios de Symfony 4:

$query = $request->query->get('query');

0

# www.example / register / admin

  /**
 * @Route("/register/{role}", name="app_register", methods={"GET"})
 */
public function register(Request $request, $role): Response
{
 echo $role ;
 }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.