Cours Laravel 5.3 – les bases – les réponses

Nous avons vu précédemment comment la requête qui arrive est traitée par les routes. Voyons maintenant les réponses que nous pouvons renvoyer au client. Nous allons voir le système des vues de Laravel avec la possibilité de transmettre des paramètres. Nous verrons aussi comment créer des templates avec l’outil Blade.

Les réponses automatiques

Nous avons déjà construit des réponses lorsque nous avons vu le routage au chapitre précédent mais nous n’avons rien fait de spécial pour cela, juste renvoyé une chaîne de caractères comme réponse. Par exemple si nous utilisons cette route :

Route::get('test', function () {
    return 'un test';
});

Nous interceptons l’url http://monsite/test et nous renvoyons la chaîne de caractères « un test ». Mais évidemment Laravel en coulisse construit une véritable réponse HTTP. Voyons cela :

Laravel construit une requête complète

On se rend compte qu’on a une requête complète avec ses headers, un contenu de type text/html, mais nous ne pouvons pas intervenir sur ces valeurs. Remarquez au passage qu’on a des cookies, on en reparlera lorsque nous verrons les sessions.

Maintenant voyons ce que ça donne si on renvoie un tableau :

Route::get('test', function () {
    return ['un', 'deux', 'trois'];
});

Cette fois on reçoit une réponse JSON :

Pour un tableau on reçoit une réponse JSON

Donc si vous voulez renvoyer du JSON il suffit de retourner un tableau et Laravel s’occupe de tout .

Construire une réponse

Le fonctionnement automatique c’est bien mais des fois on veut imposer des valeurs. Dans ce cas il faut utiliser une classe de Laravel pour construire une réponse. Comme la plupart du temps on a un helper qui nous évite de déclarer la classe en question (en l’occurrence c’est une classe de Symfony : Symfony\Component\HttpFoundation\Response).

Route::get('test', function () {
    return response('un test', 206)->header('Content-Type', 'text/plain');
});

Cette fois j’impose un code (206 : envoi partiel) et un type MIME (text/plain) :

On a construit la réponse

En fait vous aurez rarement la nécessité de préciser les headers parce que Laravel s’en charge très bien, mais vous voyez que c’est facile à faire.

On peut aussi ajouter un cookie avec la méthode cookie.

Les vues

Dans une application réelle vous retournerez rarement la réponse directement à partir d’une route, vous passerez au moins par une vue. Dans sa version la plus simple une vue est un simple fichier avec du code Html :

<!doctype html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
	<title>Ma première vue</title>
</head>
<body>
    Je suis une vue !
</body>
</html>

Il faut enregistrer cette vue (j’ai choisi le nom « vue1 ») dans le dossier resources/views avec l’extension php :

La vue dans le dossier des vues

On peut appeler cette vue à partir d’une route avec ce code :

Route::get('/', function() {
    return view('vue1');
});

Je vous rappelle la belle sémantique de Laravel qui se lit comme de la prose : je retourne (return) une vue (view) à partir du fichier de vue « vue1 ».

Voici une illustration du processus :

Le cycle de requête avec une vue

Vue paramétrée

En général on a des informations à transmettre à une vue, voyons à présent comment mettre cela en place. Supposons que nous voulions répondre à ce type de requête :

http://monsite.fr/article/n

Le paramètre n pouvant prendre une valeur numérique . Voyons comment cette url est constituée :

Constitution de l'url

 

  • la base de l’url est constante pour le site, quelle que soit la requête,

  • la partie fixe ici correspond aux articles,

  • la partie variable correspond au numéro de l’article désiré (le paramètre).

Route

Il nous faut une route pour intercepter ces urls :

Route::get('article/{n}', function($n) { 
    return view('article')->with('numero', $n); 
})->where('n', '[0-9]+');

On transmet la variable à la vue avec la méthode with.

Vue

Il ne nous reste plus qu’à créer la vue article.php dans le dossier resources/views :

<!doctype html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
	<title>Les articles</title>
</head>
<body>
	<p>C'est l'article n° <?php echo $numero ?></p>
</body>
</html>

Pour récupérer le numéro de l’article on utilise la variable $numero.

Voici une schématisation du fonctionnement :

Demande de l'article numéro 1

Il suffit de concaténer le nom de la variable au mot clé with.

On peut aussi transmettre un tableau comme paramètre :

return view('article', ['numero' => $n]);

Blade

Laravel possède un moteur de template élégant nommé Blade qui nous permet de faire pas mal de choses. La première est de nous simplifier la syntaxe. Par exemple au lieu de la ligne suivante que nous avons prévue dans la vue précédente :

<p>C'est l'article n° <?php echo $numero ?></p>

On peut utiliser cette syntaxe avec Blade :

<p>C'est l'article n° {{ $numero }}</p>

Tout ce qui se trouve entre les doubles accolades est interprété comme du code PHP. Mais pour que ça fonctionne il faut indiquer à Laravel qu’on veut utiliser Blade pour cette vue. Ça se fait simplement en modifiant le nom du fichier :

Une vue activée pour Blade

Il suffit d’ajouter « blade » avant l’extension « php ». Vous pouvez tester l’exemple précédent avec ces modifications et vous verrez que tout fonctionne parfaitement avec une syntaxe épurée.

Un template

Une fonction fondamentale de Blade est de permettre de faire du templating, c’est à dire de factoriser du code de présentation. Poursuivons notre exemple en complétant notre application avec une autre route chargée d’intercepter des urls pour des factures. Voici la route :

Route::get('facture/{n}', function($n) { 
    return view('facture')->withNumero($n); 
})->where('n', '[0-9]+');

Et voici la vue :

<!doctype html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title>Les factures</title>
</head>
<body>
	<p>C'est la facture n° {{ $numero }}</p>
</body>
</html>

C’est justement le but d’un template d’effectuer cette opération.

Voici le template :

<!doctype html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title>@yield('titre')</title>
</head>
<body>
	@yield('contenu')
</body>
</html>

J’ai repris le code commun et prévu deux emplacements repérés par le mot clé @yield et nommés « titre » et « contenu ». Il suffit maintenant de modifier les deux vues. Voilà pour les articles :

@extends('template')

@section('titre')
    Les articles
@endsection

@section('contenu')
    <p>C'est l'article n° {{ $numero }}</p>
@endsection

Et voilà pour les factures :

@extends('template')

@section('titre')
    Les factures
@endsection

@section('contenu')
    <p>C'est la facture n° {{ $numero }}</p>
@endsection

Dans un premier temps on dit qu’on veut utiliser le template avec @extends et le nom du template « template ». Ensuite on remplit les zones prévues dans le template grâce à la syntaxe @section en précisant le nom de l’emplacement et en fermant avec @endsection. Voici un schéma pour bien visualiser tout ça avec les articles :

Fonctionnement du template

Au niveau du dossier des vues on a donc les trois fichiers :

Dossier des vues

Blade permet de faire bien d’autres choses, nous verrons cela dans les prochains chapitres.

Les redirections

Souvent il ne faut pas envoyer directement la réponse mais rediriger sur une autre url. Pour réaliser cela on a l’helper redirect :

return redirect('facture');

Ici on redirige sur l’url http://monsite/facture.

On peut aussi rediriger sur une route nommée. par exemple vous avez cette route :

Route::get('users/action', function() {
    return view('users.action');
})->name('action');

Cette route s’appelle action et elle correspond à l’url http://monsite/users/action. On peut simplement rediriger sur cette route avec cette syntaxe :

return redirect()->route('action');

Si la route comporte un paramètre (ou plusieurs) on peut aussi lui assigner une valeur. Par exemple avec cette route :

Route::get('users/action/{type}', function($type) {
    return view('users.action');
})->name('action');

On peut rediriger ainsi en renseignant le paramètre :

return redirect()->route('action', ['type' => 'play']);

Des fois on veut tout simplement recharger la même page, par exemple lors de la soumission d’un formulaire avec des erreurs dans la validation des données, il suffit alors de faire :

return back();

On verra de nombreux exemples de redirections dans les prochains chapitres.

En résumé

  • Laravel construit automatiquement des réponses HTTP lorsqu’on retourne une chaîne de caractère ou un tableau.

  • Laravel offre la possibilité de créer des vues.

  • Il est possible de transmettre simplement des paramètres aux vues.

  • L’outil Blade permet de créer des templates et d’optimiser ainsi le code des vues.

  • On peut facilement effectuer des redirections avec transmission éventuelle de paramètres.‌

Laisser un commentaire