2012-01-20 17 views
7

Tengo algunas preguntas sobre Zend Framework. Estoy intentando enrutar todas las páginas estáticas a través del controlador predeterminado utilizando el método ahora predeterminado displayAction(). La intención es hacer que el pedido displayAction() procese el parámetro page, determine si la página del script existe, si muestra la vista arroje un error 404 página no encontrada. Además, se realiza una prueba para ver si existe un método con el mismo nombre que el parámetro, de ser así, invoque esa acción.Actualizado: ¿Mejores prácticas para gestionar contenido estático en Zend Framework?

Aquí se enumera la configuración de enrutamiento de la application.ini

resources.router.routes.static-pages.route = /:page 
resources.router.routes.static-pages.defaults.module = default 
resources.router.routes.static-pages.defaults.controller = index 
resources.router.routes.static-pages.defaults.action = display 

Aquí está la acciones del controlador:

public function someAction() { 
    // do something 
} 

public function displayAction() { 
    // extract page param, e.g. 'some'  
    $page = $this->getRequest()->getParam('page'); 

    // create zend styled action method, e.g. 'someAction' 
    $page_action = $page.'Action'; 

    // if a method within this controller exists, call on it 
    if (method_exists($this, $page_action)) { 
     $this->$page_action(); 
    } 

    // if nothing was passed in page param, set to 'home' 
    if (empty($page)) { 
     $page = 'home'; 
    } 

    // if script exists, render, otherwise, throw exception. 
    if (file_exists($this->view->getScriptPath(null)."/".$this->getRequest()->getControllerName()."/$page.".$this->viewSuffix)) { 
     $this->render($page); 
    } else { 
     throw new Zend_Controller_Action_Exception('Page not found', 404); 
    } 
} 

Ahora, aquí están mis preguntas: ¿Hay una mejor manera de ¿haciendo esto? Soy relativamente nuevo en este marco, entonces, ¿hay mejores prácticas que se apliquen? ¿Hay una mejor manera de invocar una acción desde un controlador? He trabajado MUCHO en la documentación, sin embargo, parece contradictorio.

Actualización 1:

Después de tener un pensamiento y una lectura, he conseguido simplificar la solución e incluir algunas cosas que se mencionaron. NOTA: Yo uso PagesController como mi controlador predeterminado de contenido estático.

Aquí figura la configuración de enrutamiento de la aplicación.ini. Para llamadas a la página de inicio, es decir "/", paso "home" como el parámetro action, para todas las demás solicitudes, el param definido por el usuario/url link se envía en action.

resources.router.routes.home.route = "/" 
resources.router.routes.home.defaults.module = "default" 
resources.router.routes.home.defaults.controller = "pages" 
resources.router.routes.home.defaults.action = "home" 
resources.router.routes.pages.route = "/:action" 
resources.router.routes.pages.defaults.module = "default" 
resources.router.routes.pages.defaults.controller = "pages" 

Aquí están las acciones del controlador. Si el parámetro define usuario como una acción, se llamará, sino que corresponde a la función mágica php __call.

public function someAction() 
{ 
    // Do something 
} 

public function __call($method, $args) 
{ 
    // extract action param, e.g. "home" 
    $page = $title = $this->getRequest()->getParam('action'); 

    // test if script exists 
    if (file_exists($this->view->getScriptPath(null) . "/" 
     . $this->getRequest()->getControllerName() . "/$page . " . $this->viewSuffix)) 
    { 
     // pass title to layout 
     $this->view->assign(compact('title')); 
     // render script 
     $this->render($page); 
    } else { 
     throw new Zend_Controller_Action_Exception('Page not found', 404); 
    } 
} 

Funciona. Entonces, estas son mis preguntas: ¿Consideraría estandarizar el uso de este método para administrar el contenido estático? ¿Si no, porque no? ¿Cómo lo mejorarías? Además, teniendo en cuenta que se trata de una solicitud GET, ¿sería acertado usar Zend_Filter_input para limpiar la entrada o simplemente es exagerado?

Respuesta

1

Su enfoque me parece razonable. Sin embargo, tal vez usted debe tomar ventaja del método __call lugar, lo que le permitiría más fácilmente encaminar las acciones ...

de configuración de la ruta así:

resources.router.routes.static-pages.route = /:action 
resources.router.routes.static-pages.defaults.module = default 
resources.router.routes.static-pages.defaults.controller = index 

Y el controlador de esta manera:

public function someAction() { 
    //going to URL /some will now go into this method 
} 

public function __call($name, $args) { 
    //all URLs which don't have a matching action method will go to this one 
} 
+0

Gracias por los comentarios, definitivamente voy a echar un vistazo a esto. – Hegemon

1

Creo que está en el buen camino, pero aquí hay algunas otras ideas.

Divida su encaminamiento por secciones en el INI: es decir, un router blog, un router página estática un foro enrutador etc .. (creo que ya está haciendo esto)

uso de las distintas clases de router para manejar enrutamiento por sección en lugar de enviarlo a un controlador.

estática: http://framework.zend.com/manual/en/zend.controller.router.html#zend.controller.router.routes.static

Todos: http://framework.zend.com/manual/en/zend.controller.router.html

Algunos enlaces que pueden ayudar:

  • codeutopia.net/blog/2007/11/16/routing- and-complex-urls-in-zend-framework/
  • www.vayani s.com/2009/03/20/intro-to-zend-framework-routing/
+0

Gracias por los comentarios, como dices, hay enrutamiento alternativo no estático para las páginas dinámicas. Echaré un vistazo a la documentación para ver si hay algo que pueda usar para mejorar el diseño. – Hegemon

Cuestiones relacionadas