Home > Actionscript, Javascript, PHP, Programacion > Extendiendo Zend Framework Router

Extendiendo Zend Framework Router

April 13th, 2009

Actualmente estoy desarrollando un sitio no muy grande, donde tengo varias funcionalidades del estilo listado de articulos, buscador, pagina de detalles de un articulo determinado, etc. Lo interesante es que también necesito tener un mini-cms, donde el cliente edite el contenido de una determinada página y la misma quede pública para los visitantes del sitio. El asunto es que las urls que utilizamos para ZF son del estilo sitio.com/modulo/controller/action. En mi caso, si el visitante quisiera acceder a la clásica página “Sobre Nosotros” deberia ir a una url del estilo: www.sitio.com/cms/ver/sobre-nosotros. Pero el cliente me pidió que la url sea algo asi: www.sitio.com/sobre-nosotros, lo cual obviamente iba un poco en contra del routeo estandar de ZF.


Me puse a googlear, e investigando un poco llegué a la siguiente solucion (no investigué mucho, por lo que calculo que capaz que hay alguna solución un poco mejor).


Básicamente lo que hice es extender el Zend_Controller_Router_Rewrite y fijarme si se puede dispatchear la url usando el esquema predefinido de ZF, si no se puede dispatchear seteo un controller y un action por defecto que se va a encargar de procesar el contenido del mini-cms. O sea, si me llega www.sitio.com/sobre-nosotros directamente voy a llamar al action ver del controller cms.

El código del router personalizado sería el siguiente:


class Stekl_Controller_Router_MiRouter extends Zend_Controller_Router_Rewrite
 
{
 
public function route(Zend_Controller_Request_Abstract $request)
 
{
 
$request = parent::route($request);
 
$dispatcher = $this->getFrontController()->getDispatcher();
 
if(!$dispatcher->isDispatchable($request)){
 
$request->setParam('pagina', $request->getControllerName());
 
$request->setControllerName('cms');
 
$request->setActionName('ver');
 
}
 
return $request;
 
}
 
}">(.*?)


No tiene nada complejo el router, simplemente lo que hago es obtener el request, luego el dispatcher y finalmente fijarme si se puede dispatchear. Si no se puede, creo un parámetro “pagina” con el valor que vino en lugar del nombre del controller. Finalmente seteo el controller y el action donde va a ocurrir la magia de interpretar el “sobre-nosotros” que me vino.


No termine aún, todavía falta decirle al Front Controller que use el router que acabo de escribir en lugar del que viene por defecto con ZF. Para ello en el bootstrap escribo lo siguiente:


$frontController = Zend_Controller_Front::getInstance();
 
$router = new Stekl_Controller_Router_MiRouter();
 
$frontController->setRouter($router);
 
$frontController->dispatch();">(.*?)


Y listo, con esto debería salir funcionando. Obviamente se podrian armar cosas un poco más elaboradas. Pero para lo que necesito me funciona.


mstekl

  1. Alejandro
    May 27th, 2009 at 13:01 | #1
    Hola, quería implementar algo parecido,, adonde ubicas la clase Stekl_Controller_Router_MiRouter ?

    saludos
  2. May 27th, 2009 at 13:07 | #2
    Hola Alejandro,
    la clase MiRouter la puse dentro del library en la ruta Stekl/Controller/Router/MiRouter.php
    El autoloader de Zend se deberia de encargar de cargarla automaticamente, sino podes hacer el require de forma manual
    Saludos
  3. alejandro
    June 2nd, 2009 at 21:26 | #3
    Buenas mstekl, esto serviría para crear una estructura del estilo:

    dominio.com/noticias/deportes/noticia1
    dominio.com/noticias/deportes/noticia2

    dominio.com/noticias/politica/noticia1
    dominio.com/noticias/politica/internacional/noticia1

    es posible hacer esto fácilmente con ZendFramework?

    SAludos
  4. June 3rd, 2009 at 09:23 | #4
    Hola Alejandro, creo que para lo que estas intentando hacer te conviene usar alguno de los ruteos que vienen con ZF. Podes encontrar mas info en: http://framework.zend.com/manual/en/zend.controller.router.html#zend.controller.router.basic

    Saludos
  5. alejandro
    June 3rd, 2009 at 16:00 | #5
    Gracias Mstekl, muy bueno el sitio
    Saludos
  1. No trackbacks yet.