Les routes

Jusqu’ici, pour afficher un composant, on plaçait sa balise dans le template HTML du composant racine app. Mais, évidemment, dans une vraie application, on ne peut pas faire cela car on veut pouvoir avoir plusieurs pages, pas juste une. Dans le jargon des weberies, on ne parle pas d’url pour ces pages, mais de route. On va donc voir maintenant comment créer des routes et on en créera une par page que l’on souhaite afficher (donc une pour se logguer sur le forum, une pour afficher la liste des cours, une pour les topics, etc.).

Les routes de l’application sont spécifiées dans le fichier app.routes.ts. Pour l’instant, il n’en contient aucune, ce qui veut dire qu’on ne peut accéder qu’à la racine de votre application :

app.routes.ts
import { Routes } from '@angular/router';

export const routes: Routes = [];

La variable routes est un tableau dont chaque élément spécifiera une route. Remplissons le :

app.routes.ts
import { Routes } from '@angular/router';
import {CoursesComponent} from './courses/courses.component';
import {MonCompComponent} from './mon-comp/mon-comp.component';

// toutes les routes (url) de l'application.
export const routes: Routes = [
  // l'url /courses contiendra une page affichant le composant Courses
  {path: 'courses', component: CoursesComponent},

  // si, dans le path, il y a des ":", cela indique que ce sont
  // des paramètres, dont on pourra récupérer la valeur. Ainsi,
  // si l'utilisateur accède à l'URL /mon-comp/42, le paramètre
  // id aura pour valeur 42
  {path: 'mon-comp/:id', component: MonCompComponent},

  // on peut faire des redirections : ici, la combinaison des valeurs de
  // path et pathMatch indiquent que la racine de l'application
  // (http://127.0.0.1:4200/) doit être redirigée vers l'url
  // http://127.0.0.1:4200/mon-comp/1234
  {path: '', pathMatch: 'full', redirectTo: '/mon-comp/1234'},

  // le wildcard ** signifie n'importe quelle url. Ici, ce sont toutes les
  // urls qui ne correspondent pas à celles du dessus.
  {path: '**', component: CoursesComponent}
];

Une route est donc un objet Javascript ayant une propriété path qui indique l’url à utiliser pour afficher le contenu de la route. Généralement, il y a également une propriété component qui indique quel composant il faut utiliser pour remplir la page.

Attention

Lorsque l’on demande à accéder à une page, une url, de votre application, Angular parcourt le tableau routes dans l’ordre où vous avez spécifiées ces routes. La première qui matche l’URL indique le composant à afficher. Il faut donc spécifier les routes de la plus spécifique à la moins spécifique. Par exemple, la route ** doit être en dernier dans le tableau.

Souvent la route ** est associée soit au composant à la racine de l’application (celui avec lequel on se loggue) soit avec un composant qui indique que l’url n’existe pas. Notez que l’on peut aussi proposer des redirections de pages. C’est ce que j’ai fait avec la 3ème route.

Si on utilise les routes, le fichier app.component.html est relativement vide. Dans celui ci-dessous, on voit une balise <h1></h1>, qui correspondra à une sorte de navbar et une balise <router-outlet />. Souvent, vous n’aurez pas un composant app plus complexe que cela.

app.component.html
<h1>Ceci est mon composant App</h1>

<router-outlet />

L’idée d’Angular c’est que le contenu de la balise <router-outlet /> est substituée par le composant correspondant à la route que l’on affiche. Par exemple, si le navigateur accède à l’url http://127.0.0.1:4200/courses, le contenu du fichier ci-dessous devient :

app.component.html
<h1>Ceci est mon composant App</h1>

<app-courses />

La page affichée correspond donc à celle ci-dessous. La partie rectangulaire en rouge correspond au composant Courses et, au dessus, on a bien la balise <h1></h1>.

L'affichage de la page pour la route `/courses`

Exercice 1 : Forum - La page de login a sa propre route   

Rajoutez une route spécifique pour la page d’authentification de votre forum. Faites également en sorte que la page par défaut, celle de l’url http://127.0.0.1:4200, soit aussi la page d’authentification. Maintenant, vous n’avez plus besoin de votre balise <app-login /> dans le fichier app.component.html.

Les liens entre les pages

Exercice 2 : Forum - L'utilisateur est loggué   

Créez un nouveau composant cours qui, plus tard, correspondra à la page des cours. Créez une route pour ce composant.

Si, dans la page de login, le message de retour de checkLogin.php indique que l’authentification est réussie, faites en sorte de vous rediriger sur cette page de cours.

Exercice 3 : Forum - Récupération de la liste des cours (1/2)   

Dans la méthode ngOnInit du composant CoursComponent, faites en sorte de récupérer du backend la liste des cours suivis par l’utilisateur, et mettez à jour votre backend afin que celui-ci vous envoie ces informations (n’oubliez pas de vous servir de la variable $_SESSION de PHP).

Affichez dans une console la liste des informations transmises par votre backend afin de débugger.

Indice 1 

Si la console vous affiche que vous n’êtes pas authentifié(e), cela signifie que vous ne transmettez pas le cookie de session PHPSESSID. Dans ce cas, vérifiez bien que le sendMessage de votre MessageService passe l’option { withCredentials: true } à la méthode post du httpClient.

Exercice 4 : Forum - Récupération de la liste des cours (2/2)   

Dans le fichier cours.component.ts, créez une interface Cours indiquant le type des données contenues dans les enregistrements retournés par votre backend (autrement dit celles contenues dans les éléments du champ data du PhpData).

Dans le TypeScript du CoursComponent, stockez la liste des cours que vous avez récupérée du backend dans un tableau de Cours et affichez la à l’intérieur d’une table HTML dans le template HTML. Pour l’instant, on ne s’intéresse pas au visuel de cette table. Ce n’est pas grave si ce n’est pas joli.

 
© C.G. 2007 - 2025