2012-01-20 9 views
7

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?

risposta

1

Il tuo approccio mi sembra ragionevole. Tuttavia, forse si dovrebbe prendere vantaggio del metodo __call invece, che permetterebbe a più facilmente via le vostre azioni ...

configurare il percorso in questo modo:

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

ed il controller in questo modo:

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

Grazie per il feedback, darò sicuramente un'occhiata a questo. – Hegemon

1

Penso che tu sia sulla strada giusta, ma qui ci sono alcune altre idee.

rompere il vostro percorso per sezioni nel INI: cioè un router blog, un router pagina statica di un forum router ecc .. (Penso che si sta già facendo questo)

Utilizzare le varie classi di router per gestire routing per sezione piuttosto che inviarlo a un controller.

statico: http://framework.zend.com/manual/en/zend.controller.router.html#zend.controller.router.routes.static

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

Alcuni link che possono aiutare:

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

Grazie per il feedback, come dici tu, è disponibile un routing alternativo non statico per le pagine dinamiche. Daremo un'occhiata alla documentazione per vedere se c'è qualcosa che posso usare per migliorare il design. – Hegemon

Problemi correlati