Ho alcune domande riguardanti Zend Framework. Sto tentando di instradare tutte le pagine statiche attraverso il controller predefinito utilizzando il metodo ora predefinito displayAction()
. L'intenzione è di fare in modo che il displayAction()
elabori la richiesta guardando il parametro page
, determini se la pagina di script esiste, se esegue il rendering della vista altrimenti genera un errore 404 non trovato nella pagina. Inoltre, viene eseguito un test per verificare se esiste un metodo con lo stesso nome del param, in tal caso, chiamare quell'azione.Aggiornato: migliori pratiche per la gestione del contenuto statico in Zend Framework?
elencati qui è la configurazione di routing dal 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
Ecco l'azioni di controllo:
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);
}
}
Ora, qui sono le mie domande: C'è un modo migliore di facendo questo? Sono relativamente nuovo a questo framework, quindi ci sono le migliori pratiche applicabili? C'è un modo migliore di chiamare un'azione da un controller? Ho fatto MOLTO curiosare nella documentazione, tuttavia, un bel po 'sembra contraddire se stesso.
Update 1:
Dopo aver un pensare e di una lettura, sono riuscito a semplificare la soluzione ed includono alcune cose che sono state menzionate. NOTA: Io uso PagesController
come controller predefinito per contenuto statico.
Qui viene elencata la configurazione di instradamento da application.ini. Per le chiamate alla home page, ad esempio "/", passo "home" come parametro action
, per tutte le altre richieste, il parametro user defined/url link viene inviato in 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"
Ecco le azioni del controller. Se l'utente definisce il parametro esiste come azione, verrà chiamato, altrimenti cadrà nella funzione magica 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);
}
}
Funziona. Quindi, ecco le mie domande: considereresti la standardizzazione sull'uso di questo metodo per gestire il contenuto statico? Se no, perché no? Come lo miglioreresti? Inoltre, considerando che questa è una richiesta GET, sarebbe una mossa saggia usare Zend_Filter_input per ripulire l'input o è solo eccessivo?
Grazie per il feedback, darò sicuramente un'occhiata a questo. – Hegemon