Dans ce chapitre nous allons nous intéresser au devenir d’une requête HTTP qui arrive dans notre application Laravel. Nous allons voir l’intérêt d’utiliser un fichier .htaccess pour simplifier les url. Nous verrons aussi le système de routage pour trier les requêtes.

Les requêtes HTTP

Petit rappels

On va commencer par un petit rappel sur ce qu’est une requête HTTP. Voici un schéma illustratif :

Les requêtes HTTP

Le HTTP (Hypertext Transfer Protocol) est un protocole de communication entre un client et un serveur. Le client demande une page au serveur en envoyant une requête et le serveur réagit en envoyant une réponse, en général une page Html.

Quand on surfe sur Internet chacun de nos clics provoque en général cet échange, et plus généralement une rafale d’échanges.

La requête du client comporte un certain nombre d’informations (headers, status code, body…).

Prenons  un exemple avec le site de Laravel. Lorsque je clique sur le lien voilà toutes les requêtes HTTP qui se produisent :

Les requêtes HTTP pour ouvrir le site de Laravel

En tout 16 requêtes avec la méthode GET. Regardons d’un peu plus près la première :

La première requête HTTP pour le site de Laravel

On trouve :

  • l’url : https://laravel.com/

  • la méthode : GET

  • l’adresse IP : 104.20.13.244:443

  • le code : 200 (donc tout s’est bien passé)

  • la version du HTTP : 1.1

Il y a évidemment bien d’autres choses dans les headers (content-type, cookies, encodage…) mais pour le moment on va se contenter de ces informations. Notre navigateur digère tout ça de façon transparente, heureusement pour nous !

Notre application Laravel doit savoir interpréter les informations qui arrivent et les utiliser de façon pertinente pour renvoyer ce que demande le client. Nous allons voir comment cela est réalisé.

Les méthodes

Il est indispensable de connaître les principales méthodes du HTTP :

  • GET : c’est la plus courante, on demande une ressource qui ne change jamais, on peut mémoriser la requête, on est sûr d’obtenir toujours la même ressource,

  • POST : elle est aussi très courante, là la requête modifie ou ajoute une ressource, le cas le plus classique est la soumission d’un formulaire (souvent utilisé à tort à la place de PUT),

  • PUT : on ajoute ou remplace complètement une ressource,

  • PATCH : on modifie partiellement une ressource (donc à ne pas confondre avec PUT),

  • DELETE : on supprime une ressource.

.htaccess et index.php

Pour Laravel on veut que toutes les requêtes aboutissent obligatoirement sur le fichier index.php situé dans le dossier public. Pour y arriver on peut utiliser une URL de ce genre :

http://monsite.fr/index.php/mapage

Mais ce n’est pas très esthétique avec ce index.php au milieu. Si vous avez un serveur Apache lorsque la requête du client arrive sur le serveur où se trouve notre application Laravel elle passe en premier par le fichier .htaccess, s’il existe, qui fixe des règles pour le serveur. Il y a justement un fichier .htaccess dans le dossier public de Laravel avec une règle de réécriture de telle sorte qu’on peut avoir une url simplifiée :

http://monsite.fr/mapage

Un petit schéma pour visualiser cette action :

La réécriture des URLS

Le cycle de la requête

Lorsque la requête atteint le fichier public/index.php l’application Laravel est créée et configurée et l’environnement est détecté. Nous reviendrons plus tard plus en détail sur ces étapes. Ensuite le fichier routes/web.php est chargé. Voici l’emplacement de ce fichier :

Le fichier des routes

C’est avec ce fichier que la requête va être analysée et dirigée. Regardons ce qu’on y trouve au départ :

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

Comme Laravel est explicite vous pouvez déjà deviner à quoi sert ce code :

  • Route : on utilise le routeur,

  • get : on regarde si la requête a la méthode « get »,

  • ‘/’ : on regarde si l’url comporte uniquement le nom de domaine,

  • dans la fonction anonyme on retourne (return) une vue (view) à partir du fichier « welcome ».

Ce fichier « welcome » se trouve bien rangé dans le dossier des vues :

La vue

C’est ce fichier comportant du code Html qui génère le texte d’accueil que vous obtenez au démarrage initial de Laravel.

Laravel propose plusieurs helpers qui simplifient la syntaxe. Il y a par exemple view pour la classe View comme on l’a vu dans le code ci-dessus.

Visualisons le cycle de la requête :

Le cycle de la requête

Laravel accepte les verbes suivants : get, post, put, patch, delete, options, any (on accepte tous les verbes).

Plusieurs routes et paramètre de route

A l’installation Laravel a une seule route qui correspond à l’url de base composée uniquement du nom de domaine. Voyons maintenant comment créer d’autres routes. Imaginons que nous ayons 3 pages qui doivent être affichées avec ces urls :

  1. http://monsite.fr/1

  2. http://monsite.fr/2

  3. http://monsite.fr/3

J’ai fait apparaître en gras la partie spécifique de l’url pour chaque page. Il est facile de réaliser cela avec ce code :

Route::get('1', function() { return 'Je suis la page 1 !'; });
Route::get('2', function() { return 'Je suis la page 2 !'; });
Route::get('3', function() { return 'Je suis la page 3 !'; });

Cette fois je n’ai pas créé de vue parce que ce qui nous intéresse est uniquement une mise en évidence du routage, je retourne donc directement la réponse au client. Visualisons cela pour la page 1 :

Demande de la page 1

On peut maintenant se poser une question : est-il vraiment indispensable de créer 3 routes alors que la seule différence tient à peu de chose : une valeur qui change ?

On peut utiliser un paramètre pour une route qui accepte des éléments variables en utilisant des accolades. Regardez ce code :

Route::get('{n}', function($n) {
	return 'Je suis la page ' . $n . ' !'; 
});

Et une visualisation du fonctionnement :

Une route paramétrée

On dit que la route est paramétrée parce qu’elle possède un paramètre qui peut prendre n’importe quelle valeur.

Erreur d’exécution et contrainte de route

Dans mon double exemple précédent lorsque je dis que le résultat est le même je mens un peu. Que se passe-t-il dans les deux cas pour cette url ?

http://monsite.fr/4

Dans le cas des trois routes vous tombez sur une erreur :

Erreur d'exécution : la route n'existe pas

Par contre dans la version avec le paramètre vous obtenez une réponse valide ! Ce qui est logique parce qu’une route est trouvée. Le paramètre accepte n’importe quelle valeur et pas seulement des nombres. Par exemple avec cette url :

http://monsite.fr/nimportequoi

Vous obtenez :

Je suis la page nimportequoi !

Ce qui vous l’avouerez n’est pas très heureux !

Pour éviter ce genre de désagrément il faut contraindre le paramètre à n’accepter que certaines valeurs. On réalise cela à l’aide d’une expression régulière :

Route::get('{n}', function($n) { 
    return 'Je suis la page ' . $n . ' !'; 
})->where('n', '[1-3]');

Maintenant je peux affirmer que les comportements sont identiques ! Mais il nous faudra régler le problème des routes non prévues.

Route nommée

Il est parfois utile de nommer une route, par exemple pour générer une url ou pour effectuer une redirection. La syntaxe pour nommer une route est celle-ci :

Route::get('/', function() {
  return 'Je suis la page d\'accueil !';
})->name('home');

Par exemple pour générer l’url qui correspond à cette route on peut utiliser l’helper route :

route('home')

Ce qui va générer l’url de base du site dans ce cas : http://monsite.

Nous verrons des cas d’utilisation de routes nommées dans les prochains chapitres.

Ordre des routes

Lisez bien ceci pour vous éviter des heure de recherches et de prises de tête . La règle est :

Regardez ces deux routes :

Route::get('{n}', function($n) { 
    return 'Je suis la page ' . $n . ' !'; 
});

Route::get('contact', function() {
    return "C'est moi le contact.";
});

Que pensez-vous qu’il va se passer avec http://monsite/contact ?

Je vous laisse deviner et tester et surtout bien retenir ce fonctionnement !

Page inconnue (erreur 404)

Il arrive souvent qu’une url ne corresponde à aucune des routes prévues. On a vu le cas ci-dessus avec l’affichage d’une erreur NotFoundHttpException. C’est parfait lorsqu’on en est au développement mais pour la production ce n’est pas vraiment ce qu’on attend !

Regardez dans le dossier des ressources :

Le dossier des ressources

On a le dossier des vues (views). On trouve en particulier la vue welcome dont on a déjà parlé ci-dessus (on verra plus tard pourquoi on ajoute le suffixe blade). On a aussi un dossier errors dans les vues. Il comporte seulement une vue 503. Vous pouvez deviner facilement que cette vue correspond à un affichage en cas d’erreur 503 (serveur indisponible).

Lorsqu’une erreur survient, Laravel regarde dans ce dossier s’il trouve un fichier avec comme nom le code de l’erreur, et si c’est le cas il affiche cette vue.

Copiez le fichier 503.blade.php et appelez la copie 404.blade.php. Dans la copie changez la ligne :

<div class="title">Be right back.</div>

Pour :

<div class="title">Cette page n'existe pas.</div>

Maintenant utilisez une url qui ne possède pas de route. Cette fois vous obtenez cette page :

La page pour l'erreur 404

Vous commencez à aimer Laravel ? Alors on continue !

En résumé

  • Laravel possède un fichier .htaccess pour simplifier l’écriture des url.

  • Le système de routage est simple et explicite.

  • On peut prévoir des paramètres dans les routes.

  • On peut contraindre un paramètre à correspondre à une expression régulière.

  • On peut nommer une route pour faciliter la génération des url ‌et les redirections.

  • On peut prévoir une vue spécifique pour chaque erreur HTTP.

    • kelignoel

      j’ai fais une peu plus de test et voilà à la conclusion à la quel je suis venu:

      Non j’ai essayé cela ne marche pas en faite après une suite de test je me suis rendu compte que ces routes la marchais :

      Route::get(‘/’, function () {
      return ‘Je suis la page d\’acceuil’;
      })-> name (‘home’);

      Route::get(‘//’, function () {
      return ‘Je suis une page de test’;
      });

      Avec ces deux routes j’ai le return qui marche bien

      Mais pas les routes qui contiennent des lettre chiffre etc ou tous autre caractère différent du /

      Par exemple
      Route::get(‘test’, function () {
      return ‘Je suis une page de test’;
      })-> name (‘test’);
      ne marche pas car il y a des lettres
      Donc si vous avez une explication je suis preneur

  1. kelignoel

    J’ai aussi une erreur avec mon fichier avec mon ficher composer.json
    qui est la suivante (que mon editeur de text ma donné file: ‘Unable to load schema from ‘https://getcomposer.org/schema.json’: Unable to to connect to https://getcomposer.org/schema.json. Error: connect ETIMEDOUT 87.98.253.108:443′
    at: ‘1,1’

  2. kelignoel

    Bonjour je suis entrain de suivre ton tutoriel mais je ne comprend pas j’ai des erreurs sur le routage je ne travaille pas en localhost mais sur un serveur debian 8.5 que je virtualise sur mon ordinateur (via virtualbox) et quand je rentre mon adresse j’ai des erreurs comme celle ci
    Not Found

    The requested URL /proof5.3/1 was not found on this server.
    Apache/2.4.10 (Debian) Server at 10.2.65.56 Port 8080

    10.2.65.56 est l’adresse d’ou je travaille mais par contre vu que j’ai fais l’installation depuis chez moi donc fichier .env j’ai l’adresse 127.0.0.1 j’ai déjà essayé des les remplacé mais cela ne fonctionne pas
    Il y a peut être quelque chose que j’ai mal compris (je suis un novice)

Laisser un commentaire