2012-04-27 10 views
8

Aquí puede encontrar mi pregunta n -th en Symfony2.¿Cómo obtener en tiempo de ejecución el nombre de la ruta en Symfony2 cuando se usa la descripción de las rutas yaml?

Estoy trabajando con un pagination bundle que utiliza el nombre de ruta proporcionado en el archivo routing.yml. Desde mi punto de vista, este enfoque no es flexible y conduce a un código sucio, ya que si cambio el nombre de la ruta, entonces tengo que mirar todas las plantillas Twig o los archivos PHP para actualizar el nombre de la ruta. Esto está bien para pequeñas aplicaciones web, pero proporcionará un error de este tipo para aplicaciones más grandes y también necesita una gran carga para el desarrollador.

Por lo tanto, me preguntaba pasar una variable de cadena x al objeto Pager proporcionado por el paquete mencionado anteriormente. La cadena x debe inicializarse dentro del controlador y debe proporcionar el nombre de ruta deseado como figura en el archivo routing.yml.

Déjeme dar un ejemplo. El archivo de enrutamiento es la siguiente:

//routing.yml 
AcmeTestBundle_listall: 
pattern: /test/page/{page} 
defaults: { _controller: AcmeTestBundle:List:listall, page: 1 } 
requirements: 
    page: \d+ 

continuación, el controlador relacionado es:

//use something.... 
class ListController extends Controller 
{ 

    public function exampleAction($page) 
    { 
    $array = range(1, 100); 
    $adapter = new ArrayAdapter($array); 
    $pager = new Pager($adapter, array('page' => $page, 'limit' => 25)); 

    return array('pager' => $pager); 
    } 
} 

Luego, en la plantilla ramita, la $pager recibe el nombre de la ruta que se refiere al haz de arriba

{% if pager.isPaginable %} 
    {{ paginate(pager, 'AcmeTestBundle_listall') }} 
{% endif %} 
{% for item in pager.getResults %} 
    <p>{{ item }}</p> 
{% endfor %} 

¿Alguna idea de cómo obtener el valor de cadena 'AcmeTestBundle_listall' en tiempo de ejecución solo dentro del controlador?

Respuesta

30

Puede usar la variable global app que está disponible en ramitas para obtener la ruta actual de la solicitud.

{% if pager.isPaginable %} 
    {{ paginate(pager, app.request.get('_route') }} 
{% endif %} 

Más sobre apphere y here.

+0

¡Seguro! Muchas gracias! Respuesta rápida y clara ... ¡muy apreciada! – JeanValjean

+0

Para agregar a esto, si necesita los parámetros de ruta, use app.request.get ('_ route_params') –

+3

Symfony almacena el nombre de la ruta como un * atributo * de la Solicitud, por lo que debería recuperarse como tal: 'aplicación .request.attributes.get ('_ route') '. Evite utilizar el método 'Request :: get()' porque primero intenta recuperar el parámetro de la bolsa de parámetros de consulta; la bolsa de atributos solo se usa como alternativa. Dicho esto, usando 'Request :: get()', un usuario puede anular '_route' al agregar'? _route = my_tainted_param' a la URL. –

Cuestiones relacionadas