Ce tutoriel est le deuxième de la série pour créer un module Drupal 8. Dans cette partie, nous allons voir les Controllers et la gestion des Routes. Le tutoriel précédent est disponible ici.
Pour donner un exemple concret, je propose de créer un Controller qui affichera un paramètre sur une page
Le rôle du Controller
Comme dit précédemment, Drupal 8 est basé sur le Framework Symfony 2. Symfony est basé sur le concept de MVC (Modèle, Vue et Controller).
Le Modèle correspond aux données stockées dans une base de données ou bien dans un fichier.
La Vue va correspondre à l’HTML et au CSS.
Et finalement le Controller va gérer les différentes actions utilisateurs/applications. Dans notre cas, nous voulons récupérer une valeur de l’url que nous allons utiliser pour l’afficher sur une page.
Le rôle des Routes
Les routes comme leur nom le sous entend, est le chemin vers une page, un fichier, un formulaire, etc… Une route permet de faire comprendre à Drupal ce qu’il doit faire si on saisit une url précise.
Comme la plupart des fichiers de configuration de Drupal, celui-ci est un fichier YAML, et par convention doit être nommé :
nom_module.routing.yml
Si vous avez commencé à partir du tutoriel précédent, le votre devrait se nommer tuto_module.routing.yml et doit se trouver à la racine de votre module au même niveau que le tuto_module.info.yml.
Une route simple est composée d’un nom servant à l’identifier, d’un chemin (l’url), d’un titre de page, d’un Controller et aussi les permissions requises pour y accéder.
Structure du module Drupal
Nous allons créer à la racine de notre module un dossier src, puis dans celui-ci un dossier Controller.
Dans le dossier Controller, nous allons créer un fichier php du nom TutoModuleController.php.
TutoModuleController.php
<?php
namespace Drupal\tuto_module\Controller;
use Drupal\Core\Controller\ControllerBase;
class TutoModuleController extends ControllerBase
{
public function display_message(string $message){
return ['#markup' => $message];
}
}
Ce qu’il faut retenir de ce code est :
Drupal étant basé sur Symfony, celui-ci utilise les namespaces.
Pour faire simple, les namespaces permettent d’améliorer la lisibilité du code et d’organiser les classes d’un projet, comme on peut faire avec les packages en Java.
Ils permettent aussi d’identifier les classes que nous utilisons.
Imaginons, nous utilisons deux classes ayant le même nom, il faudrait faire cela pour pouvoir les différencier :
<?php
$obj_1 = new Librairie1\chemin\MaClass();
$obj_2 = new Librairie2\chemin\MaClass();
Pour spécifier la classe que nous souhaitons utiliser, il faut utiliser le mot-clé use. Si on reprend l’exemple ci-dessus, et que l’on souhaite faire référence uniquement à MaClass de la librairie 1, il faudrait faire comme-cela :
<?php
use Librairie1\chemin\MaClass;
$obj_1 = new MaClass();
$obj_2 = new MaClass();
Fermons cette parenthèse sur les namespaces et regardons le reste du code.
class TutoModuleController extends ControllerBase
Cela veut dire que nous étendons notre classe à la classe ControllerBase de Drupal, puis nous créons la méthode qui va servir à afficher le message.
Elle prendra une variable de type texte en paramètre et retournera un render array simple de type #markup.
Je ne m’attarde pas plus sur les render arrays, nous verrons cela dans la prochaine partie de la création d’un module.
tuto_module.routing.yml
Maintenant que nous avons créé notre Controller, nous allons créer notre route dans le fichier routing.
tuto_module.affichage_lien:
path: '/affichage-lien/{message}'
defaults:
_title: Tuto | Affichage d'un texte
_controller: '\Drupal\tuto_module\Controller\TutoModuleController::display_message'
requirements:
_permission: 'access content'
Donc, la première ligne est le nom de la route, la deuxième est le chemin. {message} correspond au paramètre que nous avons mis dans la méthode de notre Controller, le texte à afficher sur notre page.
Dans defaults, j’ai défini le titre de la page et la méthode utilisée dans le Controller.
Finalement dans les permissions, je demande que l’utilisateur ai le droit de consulter du contenu.
Tester le module
Maintenant pour tester le module, si vous ne l’avez pas encore fait, activez le module dans la partie admin, puis saisissez l’adresse de votre site/affichage-lien/un message
On peut voir que Drupal a créé une page, a récupéré le titre de la route et a affiché le paramètre renseigné dans l’url.
Conclusion
Notre module commence à prendre forme. Il y a quelques notions à assimiler comme les Controller, les Route et les namespaces.
Dans la prochaine partie, nous verrons les templates pour mettre en forme notre contenu.