Tip: Solucionar el problema de la Barra Final (Trailing Slash) en el routing de Symfony

danii . Lunes 20 de diciembre de 2010. a las 11:57

Este problema de la Barra Final (traducción mía del inglés Trailing Slash) en el sistema de routing del framework Symfony puede ser un auténtico quebradero de cabeza. Lo que ocurre es que el Symfony no entiende las urls con una barra ‘/’ al final como las mismas que sin la barra ‘/’, y por tanto nos manda a un error 404 que nos puede descolocar.

Además, sin tener un poco de “maestría” del funcionamiento del flujo interno del framework no es fácil de solucionar. Por ejemplo, a nosotros la primera vez que nos surgió este problema, la única solución que encontramos fue duplicar todas las entradas del routing del framework, con y sin barra (slash) ‘/’ final. Como os podéis imaginar no quedó para nada bonito ni mantenible.

Aunque un simple redirect nos puede salvar del apuro, hemos encontrado que la mejor solucion es crear una clase que herede de la clase interna de Symfony sfWebRequest y que sea ésta la que se encarge de eliminar el slash final. De esta manera, el framework entero verá la url como si no tuviera la barra ‘/’ y ya no distinguirá entre unas y otras (ni nos mandará un 404).

Para hacer esto, vamos al YAML de configuración en:

/apps/mi_aplicacion/config/factories.yml

Y debajo de la seccion all, en request, introducimos el nombre de nuestra clase (dejamos todo lo demás igual):

all:
  request:
    class: myWebRequest

Y a continuación creamos esta clase en:

/apps/mi_aplicacion/lib/myWebRequest.class.php

Y en ella sobrecargamos la función getPathInfo de sfWebRequest:

<?php
class myWebRequest extends sfWebRequest
{
  public function getPathInfo()
  {
    $pathInfo = parent::getPathInfo();

    //eliminamos la barra '/' final con una regexp:
    $pathInfo = preg_replace('/\/$/', '', $pathInfo);

    return $pathInfo;
  }
}

Etiquetas: , , ,

Enviar comentario