Section: Récupération des paramètres HTTP
« Développer un contrôleur | ^ Développement d'un module | Générer des erreurs HTTP » |
− Table des matières
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 obtiendreztrue
si le paramètre vaut"true"
,"1"
,"on"
, ou"yes"
, etfalse
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"]
.