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?
Gracias por los comentarios, definitivamente voy a echar un vistazo a esto. – Hegemon