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.

Abdul Hamid
fuente
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
Aquí hay más información: roadtodev.com/recuperer-objet-request-de-symfony
Thomas Bredillet

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');
Cerad
fuente
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 }
pkout
fuente
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()
Escorpión
fuente
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

MartinW.
fuente
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');
Reinherd
fuente
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

luchaninov
fuente
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');
Ashish Awasthi
fuente
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');
Yoander
fuente
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 .

Antonis Charalambous
fuente
1
$request = Request::createFromGlobals();
$getParameter = $request->get('getParameter');
Manuel M.
fuente
¿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

Reunirse
fuente
0

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

$form->get('nameSelect')->getClientData();
sncardonam
fuente
0

Intenta esto, funciona

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

Saludos

AchrafSoltani
fuente
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');
}
abhinand
fuente
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');
Herrero
fuente
0

# www.example / register / admin

  /**
 * @Route("/register/{role}", name="app_register", methods={"GET"})
 */
public function register(Request $request, $role): Response
{
 echo $role ;
 }
Khandaker Toihidul Islam
fuente