2012-01-20 4 views
7

J'ai quelques questions concernant le Zend Framework. Je tente d'acheminer toutes les pages statiques via le contrôleur par défaut en utilisant la méthode displayAction() par défaut. L'intention est d'avoir le displayAction() traiter la demande en regardant le param page, déterminer si la page de script existe, si elle rend la vue sinon lancer une erreur de 404 pages non trouvées. De plus, un test est effectué pour voir si une méthode portant le même nom que le param existe, si c'est le cas, appelez cette action.Mise à jour: Bonnes pratiques de gestion du contenu statique dans Zend Framework

Listed ici est la configuration de routage du 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 

Voici les actions du contrôleur:

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); 
    } 
} 

Maintenant, voici mes questions: Y at-il une meilleure façon de Ce faisant? Je suis relativement nouveau dans ce cadre, alors y a-t-il des pratiques exemplaires qui s'appliquent? Existe-t-il une meilleure façon d'appeler une action depuis un contrôleur? J'ai fait BEAUCOUP de regarder autour de la documentation, cependant, une bonne partie semble se contredire.

Mise à jour 1:

Après avoir une réflexion et une lecture, je l'ai réussi à simplifier la solution et inclure un certain nombre de choses qui ont été mentionnées. REMARQUE: j'utilise PagesController comme contrôleur de contenu statique par défaut.

La configuration du routage à partir du fichier application.ini est répertoriée ici. Pour les appels à la page d'accueil, c'est-à-dire «/», je passe «home» au paramètre action, pour toutes les autres demandes, le paramètre de lien défini par l'utilisateur/url est envoyé au 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" 

Voici les actions du contrôleur. Si l'utilisateur définit le paramètre existe comme une action, il sera appelé, sinon il tombe à la fonction magique 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); 
    } 
} 

Cela fonctionne. Donc, voici mes questions: envisageriez-vous de standardiser l'utilisation de cette méthode pour gérer le contenu statique? Si non, pourquoi pas? Comment l'amélioreriez-vous? En outre, étant donné qu'il s'agit d'une requête GET, serait-il sage d'utiliser Zend_Filter_input pour nettoyer les entrées ou est-ce juste trop?

Répondre

1

Votre approche me semble raisonnable. Cependant, peut-être vous devriez profiter de la méthode __call à la place, ce qui vous permettra de plus facilement acheminer vos actions ...

Configurez votre itinéraire comme ceci:

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

Et votre contrôleur comme ceci:

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

Merci pour les commentaires, je vais certainement jeter un oeil à cela. – Hegemon

1

Je pense que vous êtes sur la bonne voie mais voici quelques autres idées.

Cassez votre routage par sections dans votre INI: -à-dire un routeur de blog, un routeur page statique un routeur forum etc .. (je pense que vous faites déjà)

Utilisez les différentes Classes de routeur pour gérer routage par section plutôt que de l'envoyer à un contrôleur.

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

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

Quelques liens qui peuvent aider:

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

Merci pour les commentaires, comme vous le dites, le routage alternatif non statique est en place pour les pages dynamiques. Je jetterai un coup d'oeil dans la documentation pour voir s'il y a quelque chose que je peux utiliser pour améliorer la conception. – Hegemon

Questions connexes