Raccourcis : Contenu - rubriques - sous rubriques
EN FR

Oublier les variables $_GET, $_POST...

Dans une action d'un contrôleur, une des tâches que vous ferez le plus souvent, est de récupérer les paramètres de la requête HTTP.

En PHP "classique", on fait appel à $_GET, $_POST, $_REQUEST, $_FILES etc.

À part pour l'upload des fichiers ($_FILES), il ne faut pas utiliser ces variables, mais passer par certaines méthodes du contrôleur.

En effet, un module étant censé être réutilisable, il ne sait donc pas où récupérer les paramètres dont il a besoin. Par exemple, au changement d'une URL, il se peut qu'un paramètre que vous trouviez dans $_GET se trouve maintenant dans le PATHINFO de l'URL, ou que cela soit passé en POST etc... Plus important, des plugins de coordinateurs, peuvent rajouter des paramètres ou modifier ceux qui sont reçu (sans modifier les tableaux originaux).

Enfin, suivant les protocoles (SOAP, XMLRPC,..), les paramètres peuvent aussi se trouver dans le corps de la requête HTTP..

C'est pourquoi Jelix propose un moyen, unifié, pour récupérer des paramètres de requêtes via des méthodes du contrôleur.

Récupérer les paramètres de requête

Comme vous le savez, les paramètres de la requête http sont stockés dans un objet jRequest, qui lui même est stocké dans l'objet jCoordinator. On peut ainsi récupérer un paramètre de cette façon :


  $id = jApp::coord()->request->getParam('id');

Mais il y a plus pratique : la méthode param() disponible dans les contrôleurs, au résultat équivalent.


  $id = $this->param('id');

Si il n'y a pas de paramètre de nom id, le résultat sera la valeur null. Vous pouvez aussi indiquer en deuxième argument une valeur qui sera prise si le paramètre indiqué n'existe pas.


  $titre = $this->param('title','un titre');

Il y a d'autres méthodes similaires, comme intParam(), floatParam() ou boolParam(), prenant les mêmes arguments, mais transformant le paramètre récupéré dans le type de donnée correspondant. Cela permet ainsi de "filtrer" les données.

  • intParam(), pour récupérer un nombre entier;
  • floatParam(), un décimal.
  • boolParam(), vous obtiendrez true si le paramètre vaut "true", "1", "on", ou "yes", et false dans le cas contraire.

Si vous voulez un filtrage pour d'autres types de données, utilisez la classe jFilter.

Cas du PUT

PHP ne supporte pas correctement la méthode HTTP PUT. En effet, il ne récupère pas les paramètres qui pourraient être éventuellement dans le corps de la requête http, comme il le fait avec la méthode POST (il n'y a pas de $_PUT).

Jelix pallie ce défaut, en extrayant lui-même ces paramètres (via php://input), à condition que le type de contenu soit application/x-www-url-encoded ou multipart/form-data, comme pour POST. Vous appellerez donc la méthode param() comme dans n'importe quel contrôleur, en indiquant le paramètre voulu.

Par contre, les fichiers éventuellement transmis dans un contenu multipart/form-data, ne sont pas mis dans $_FILES, il vous faudra donc les traiter vous-même, en les récupérant comme les autres paramètres ($this->param('foo')).

Récupérer du contenu JSON

Quand le contenu reçu est de type application/json, Jelix 1.7+ decode le contenu, et si il s'agit d'un objet JSON, il est lu comme étant un tableau associatif dont les élements seront accessibles par leur nom comme n'importe quel paramètre.

Exemple : si vous reçevez cet objet JSON


{
    "prenom": "tom",
    "nom": "dupont"
}

Alors vous pouvez récupérer chacun des propriétés de l'objet en faisant :


$nom = $this->param('nom');
$prenom = $this->param('prenom');

Si vous préférez récuperer le contenu JSON, appelez la méthode getBody() sur l'objet request.


    $values = json_decode($this->request->getBody());

Récupérer d'un contenu spécifique

Pour les contenus autres que application/x-www-url-encoded, multipart/form-data et application/json, vous récupérerez ceux-ci via deux manière différentes.

Soit en récupérant le paramètre __httpbody :


  $data = $this->param('__httpbody');

Soit en appellant la méthode getBody() sur l'objet request.


    $values = json_decode($this->request->getBody());

À vous ensuite d'analyser le contenu en fonction du type des données, que vous trouverez dans $_SERVER["CONTENT_TYPE"].