IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Tutoriel pour apprendre à utiliser le framework Laravel 4


précédentsommairesuivant

V. Chapitre 5 : Les entrées

Nous avons vu comment une requête est dirigée selon son URI grâce aux routes. Nous avons aussi vu comment récupérer des paramètres présents dans cet URI. Maintenant nous allons voir comment récupérer les données transmises.

V-A. Récupérer des données transmises

La façon la plus classique de transmettre des informations est certainement l'usage d'un formulaire. Voici un formulaire élémentaire avec deux entrées (je décris la classe Form dans un chapitre ultérieurChapitre 11 : Gestion des erreurs) que j'ai inclus pour le moment dans la route de base :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Route::get('/', function()
{
    echo Form::open(array('url' => 'log', 'method' => 'GET'));
    echo Form::label('nom', 'Nom :');
    echo Form::text('nom'),'<br>';
    echo Form::label('age', 'Age :');
    echo Form::text('age'),'<br>';
    echo Form::submit('Submit');
    echo Form::close();
});

Voici ce que ça donne dans un navigateur (bon d'accord ce n'est pas folichon, mais ce n'est pas le sujet) :

Nous allons créer une route pour intercepter l'URL de retour et prendre en compte les valeurs entrées :

Image non disponible
 
Sélectionnez
1.
2.
3.
4.
Route::any('log', function()
{
    return 'Le nom est '.Input::get('nom').'<br>'.'L\'âge est '.Input::get('age');
});

Vous remarquez que pour la route je n'ai utilisé ni get, ni post, mais any. Ainsi la route sera activée quelle que soit la méthode utilisée. En l'occurrence dans le formulaire j'ai prévu la méthode get. Par exemple pour les entrées toto et 28 l'URI prend cette forme :

 
Sélectionnez
http://localhost/laravel/public/log?nom=toto&age=28

Et on obtient en retour :

 
Sélectionnez
Le nom est toto
L'âge est 28

Faites le même essai avec la méthode post (comme c'est la valeur par défaut on n'est pas obligé de la mentionner) :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Route::get('/', function()
{
    echo Form::open(array('url' => 'log'));
    echo Form::label('nom', 'Nom :');
    echo Form::text('nom'),'<br>';
    echo Form::label('age', 'Age :');
    echo Form::text('age'),'<br>';
    echo Form::submit('Submit');
    echo Form::close();
});

Vous obtenez le même résultat. On n'a donc pas à se soucier de la méthode utilisée, la syntaxe reste la même pour récupérer les valeurs :

 
Sélectionnez
Input::get('nom_de_la_valeur')

V-A-1. Tester les données transmises et les valeurs par défaut

Que se passe-t-il si une valeur attendue est absente ? Si nous poursuivons avec notre exemple, si l'âge est absent j'aurai cet affichage :

 
Sélectionnez
Le nom est toto
L'âge est

Il y a une possibilité pour gérer ce problème, il faut tester la présence de la valeur :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
Route::any('log', function()
{
    $texte = 'Le nom est '.Input::get('nom');
    if (Input::has('age')) $texte .='<br>'.'L\'âge est '.Input::get('age');
    return $texte;
});

Il est possible de prévoir une valeur par défaut si l'entrée est absente :

 
Sélectionnez
$texte = 'Le nom est '.Input::get('nom', 'Dupont');

Attention ! Il faut vraiment que la donnée soit absente (c'est-à-dire null) pour que ça fonctionne, autrement dit un retour de formulaire avec un champ vide ne déclenchera pas cette option !

V-A-2. Les données dans un tableau

Il est parfois pratique de récupérer toutes les données dans un tableau pour effectuer un traitement global. Voici comment faire :

 
Sélectionnez
1.
2.
3.
4.
Route::any('log', function()
{
    return var_dump(Input::all());
});

Avec toujours le même formulaire et les mêmes entrées on obtient :

 
Sélectionnez
array(2) { ["nom"]=> string(4) "toto" ["age"]=> string(2) "28" }

On a la possibilité de sélectionner seulement certaines entrées pour le tableau. Enrichissons notre formulaire :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Route::get('/', function()
{
    echo Form::open(array('url' => 'log'));
    echo Form::label('nom', 'Nom :');
    echo Form::text('nom'),'<br>';
    echo Form::label('ville', 'Ville :');
    echo Form::text('ville'),'<br>';
    echo Form::label('age', 'Age :');
    echo Form::text('age'),'<br>';
    echo Form::submit('Submit');
    echo Form::close();
});

Ce qui donne :

Image non disponible

Maintenant on veut récupérer dans un tableau uniquement les entrées Nom et Ville :

 
Sélectionnez
1.
2.
3.
4.
Route::any('log', function()
{
    return var_dump(Input::only('nom', 'ville'));
});

Voici ce que ça donne avec une saisie :

 
Sélectionnez
array(2) { ["nom"]=> string(6) "Durant" ["ville"]=> string(5) "Paris" }

On peut obtenir le même résultat en excluant l'âge :

 
Sélectionnez
1.
2.
3.
4.
Route::any('log', function()
{
    return var_dump(Input::except('age'));
});

V-A-3. Les fichiers

Voyons maintenant comment récupérer un fichier. Créons un formulaire élémentaire :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
Route::get('/', function()
{
    echo Form::open(array('url' => 'trans', 'enctype' => 'multipart/form-data'));
    echo Form::file('fichier');
    echo Form::submit('Envoyer le fichier');
    echo Form::close();
});
Image non disponible

Et voici la route :

 
Sélectionnez
1.
2.
3.
4.
Route::any('trans', function()
{
    echo var_dump(Input::file('fichier'));
});

Et le résultat de l'action :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
object(Symfony\Component\HttpFoundation\File\UploadedFile)[9]
  private 'test' => boolean false
  private 'originalName' => string 'routes.php' (length=10)
  private 'mimeType' => string 'text/plain' (length=10)
  private 'size' => int 642
  private 'error' => int 0

Vous voyez ici que Laravel utilise un composant de Symfony Image non disponible.

Vous constatez aussi qu'il est facile de trouver le nom du fichier, son type MIME et sa taille puisqu'on a un objet qui contient ces éléments. On reçoit un fichier, il faut maintenant en faire quelque chose : normalement le placer dans un dossier quelque part, en effet par défaut PHP conserve un fichier téléchargé seulement jusqu'à la fin du script. Créez un dossier public/uploads :

Image non disponible

Modifiez ainsi la route :

 
Sélectionnez
1.
2.
3.
4.
Route::any('trans', function()
{
    Input::file('fichier')->move('uploads');
});

Utilisez le formulaire pour envoyer un fichier et regardez ensuite dans le dossier uploads :

Image non disponible

Le fichier a bien été reçu et placé dans le bon dossier, par contre il se retrouve avec un nom différent et une extension .tmp. On peut imposer un nom et une extension :

 
Sélectionnez
1.
2.
3.
4.
Route::any('trans', function()
{
    Input::file('fichier')->move('uploads', 'mon_fichier.jpg');
});

Résultat :

Image non disponible

précédentsommairesuivant

Copyright © 2017 Laravel. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.