2012-07-23 17 views
17

Tal vez me esté faltando algo, pero no parece haber una manera de definir los parámetros de la cadena de consulta en las rutas en Symfony2 para que puedan pasarse a un controlador.Symfony2: ¿Cómo pasar los parámetros url querystring a los controladores?

Por ejemplo, en lugar de generar un URI como /blog/my-blog-post (de Symfony2 de routing documentation) y que pasa a la siguiente ruta:

# app/config/routing.yml  
blog_show: 
    pattern: /blog/{slug} 
    defaults: { _controller: AcmeBlogBundle:Blog:show } 

yo preferiría para generar un URI como /blog?slug=my-blog-post. El problema es que no puedo encontrar ningún lugar para definir el parámetro slug en el archivo de configuración de ruta (como su contraparte {slug} anterior).

Quizás esto sea a propósito, pero ¿cuál es la mejor práctica para trabajar con parámetros GET en la cadena de consulta?

La documentación no hace mención de ellos en Generating URLs with Query Strings, entonces, ¿cómo pasarlos al controlador?

Dónde puedo encontrar mención de ellos es Symfony2 and HTTP Fundamentals:

use Symfony\Component\HttpFoundation\Request; 

$request = Request::createFromGlobals(); 

// retrieve GET variables 
$request->query->get('foo'); 

¿Es esta la mejor práctica para trabajar con ellos dentro del controlador?

Respuesta

44

Para trabajar con parámetros GET/POST en un controlador que se extiende Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller:

public function updateAction() 
{ 
    $request = $this->getRequest(); 
    $request->query->get('myParam'); // get a $_GET parameter 
    $request->request->get('myParam'); // get a $_POST parameter 
    ... 
} 

Para un controlador que no se extiende el controlador base Symfony, declarar el objeto de solicitud como un parámetro del método de acción y proceder como arriba:

public function updateAction(Request $request) 
{ 
    $request->query->get('myParam'); // get a $_GET parameter 
    $request->request->get('myParam'); // get a $_POST parameter 
    ... 
} 
+12

Desde Symfony 2.4, el método 'getRequest()' no es w deprecated y uno debe usar el segundo truco, con el parámetro 'Request' en el método del controlador. el método 'getRequest()' se eliminará en Symfony 3. – Brewal

+0

@Brewal: pero si tiene un 'Controller' que amplía' Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller' y que ya obtiene los parámetros definidos en su ruta, ¿todavía puede obtener la Solicitud de esta manera o simplemente tiene que usar 'Request :: createFromGlobals()' ahora? – fritzmg

+1

Aún puede obtener la solicitud gracias al tipo 'Solicitud' especificado justo antes de la variable' $ request'. Symfony es lo suficientemente inteligente como para adivinar eso. – Brewal

26

No puede especificar los parámetros de cadena de consulta en los archivos de configuración de enrutamiento. Acaba de obtenerlos del objeto $ request en su controlador: $request->query->get('foo'); (será null si no existe).

Y para generar una ruta con un parámetro dado, puede hacerlo en ti ramita plantillas de ese tipo:

{{ path(route, query|merge({'page': 1})) }} 

Si desea generar una ruta en su controlador, que es igual que en la documentación que ligados entre sí:

$router->generate('blog', array('page' => 2, 'category' => 'Symfony')); 

generará la ruta /blog/2?category=Symfony (los parámetros que no existen en la definición de la ruta se pasarán como cadenas de consulta).

+0

Documentación: [generar-urls-con-query-strings] (http://symfony.com/doc/current/routing.html#generating-urls -with-query-strings) – Stphane

Cuestiones relacionadas