Re: Comment prendre en compte la chaîne Querystring dans un controleur ?

41 views
Skip to first unread message

Amaury Bouchard

unread,
Jul 27, 2012, 4:59:46 AM7/27/12
to fineme...@googlegroups.com
Commençons avec les paramètres dans les actions.

Habituellement, il n'y pas besoin d'utiliser l'objet \Temma\Request
Imaginons que tu veuilles prendre en charge les deux URL suivantes avec la même action :

Cela peut être géré avec le code suivant :
 class ArticleController extends \Temma\Controller {
     public function execVoir($id, $title, $style="default") {
         // ...
     }
 }

Cette action peut prendre 3 paramètres, le troisième étant optionnel.


Par contre, si on fait un plugin, et que celui-ci a besoin de connaître le contrôleur ou l'action appelé (ou les paramètres transmis à l'action), il faut effectivement faire appel à l'objet \Temma\Request.
Par exemple :
 class CheckPlugin extends \Temma\Controller {
     public function plugin() {
         // quel contrôleur ?
         if ($this->_request->getController() == "article") {
             // ...
         }
         // quelle action ?
         if ($this->_request->getAction() == "voir") {
             // ...
         }
         // combien de paramètres fournis ?
         if ($this->_request->getNbrParams() > 2) {
             // ...
         }
         // quelle valeur pour le 3ème paramètre ?
         if ($this->_request->getParam(2) == "abcdef") {
             // ...
         }
         // on peut modifier l'un des paramètres
         $this->_request->setParam(1, "autre-titre");
         // on peut même même récupérer tous les paramètres d'un coup,
         // et tous les modifier d'un coup aussi
         $params = $this->_request->getParams();
         shuffle($params);
         $this->_request->setParams($params);
     }
 }

S'il ne s'agit que de récupérer le nom du contrôleur ou de l'action, on n'est même pas obligé d'utiliser l'objet \Temma\Request :
 class CheckPlugin extends \Temma\Controller {
     public function plugin() {
         // quel contrôleur ?
         if ($this->get("CONTROLLER") == "article") {
             // ...
         }
         // quelle action ?
         if ($this->get("ACTION") == "voir") {
             // ...
         }
     }
 }

Bon, maintenant parlons des paramètres GET. Plutôt que de vouloir jouer avec la query string, il vaut mieux utiliser le tableau $_GET qui est rempli par PHP.
Ainsi, si on veut gérer l'URL http://www.test.com/article/voir/123/titre?style=special on pourra utiliser le code suivant :
 class ArticleController extends \Temma\Controller {
     public function execVoir($id, $title) {
         // ...
         if ($_GET['style'] == 'special')
             $this->template('article/special.tpl');
     }
 }

De manière générale, il vaut mieux utiliser des paramètres "dans l'URL" (qui se retrouvent à être passés à l'action comme des paramètres de fonction), plutôt que des paramètres GET. C'est plus propre : on connait leur nombre, on connait leur ordre (c'est mieux pour le référencement), on sait explicitement lesquels sont obligatoires et lesquels sont optionnels, et peut définir la valeur par défaut pour ceux qui sont optionnels, ...


Le jeudi 26 juillet 2012 14:22:20 UTC+2, Jérôme Lauriol a écrit :
Une supposition :

Nous avons a traiter une URL ainsi formée : www.domain.com/_controller_/_action_/_param1_/_param2_?foo=bar&foo2=bar2

Comment traiter de manière efficace cette URL ?

Pour _controller_, _action_, _param1_, _param2_ : pas de problème, l'objet Resquest récupère tout ça et c'est accessible via getController(), getAction() et getParams() ou getParam(). Mais pour la partie querystring ("foo=bar&foo2=bar2") ?

Faut-il faire appel à $_SERVER['QUERY_STRING'] dans le contrôleur ou un plugin, ou existe-il un moyen plus propre de récupérer ces valeurs en amont pour les faire suivre aprés les avoir filtrées ?
Reply all
Reply to author
Forward
0 new messages