13.x ainsi que sur l’implémentation du Framework v13.36.0. Pour l’écriture classique d’un middleware, consultez Middleware.
Distinguer enregistrement, application et exécution
Router::aliasMiddleware() enregistre dans un tableau du Router l’alias comme clé et le nom de classe comme valeur. Il ne crée pas d’instance du middleware et ne l’applique à aucune route.
Le nom d’alias fait partie de l’API publique. Évitez les noms intégrés comme
auth ou throttle, ainsi que les noms génériques susceptibles d’entrer en conflit avec d’autres packages, et ajoutez un préfixe propre au package. Si vous enregistrez de nouveau la même clé, aliasMiddleware() écrase la correspondance précédente.
Exposer l’alias depuis le service provider
Dans l’exemple suivant, nous créons un middleware qui ajoute un en-tête d’identification fixe à la réponse. Il ne s’agit pas d’un exemple d’authentification, d’autorisation ou de contrôle d’accès. On suppose que le PSR-4 de Composer fait correspondreAcme\Courier\ à src/ et que le service provider est enregistré par découverte automatique ou manuellement.
src/Http/Middleware/AddCourierHeader.php
boot(). Les arguments de boot() sont injectés par le conteneur de services : il n’est donc pas nécessaire de modifier automatiquement le bootstrap/app.php de l’utilisateur pour enregistrer le middleware.
src/CourierServiceProvider.php
L’utilisateur l’applique route par route
Dans le fichierroutes/web.php de l’application, assignez-le uniquement aux routes qui en ont besoin.
routes/web.php
->middleware(AddCourierHeader::class). Le choix dépend de la nécessité ou non de proposer un nom court aux utilisateurs.
Lorsque le package fournit lui-même des routes, indiquez explicitement les middlewares nécessaires dans le fichier de routes. loadRoutesFrom() n’ajoute pas automatiquement web ou api. Pour la méthode d’enregistrement et la gestion du cache des routes, consultez Enregistrement et cache des routes d’un package.
C’est à l’utilisateur de choisir une application à toute l’application
Pour l’appliquer à toutes les routesweb de l’application, l’utilisateur ajoute la configuration suivante dans son callback withMiddleware() existant. Il ne s’agit pas d’un exemple qui remplace la configuration existante.
web, et non la pile globale. Le middleware n’est pas appliqué automatiquement à api ni aux routes qui n’ont aucun de ces groupes.
Les opérations de groupe du Router diffèrent
Si le package fournit son propre groupe, utilisez un nom qui lui est propre. Voici un exemple à placer dans leboot(Router $router) du service provider.
->middleware('acme-courier'). Toutefois, ce groupe ne contient que les classes indiquées et n’hérite ni des sessions ni de la protection CSRF de web.
Il existe aussi des API pour ajouter des éléments à un groupe existant, mais l’implémentation du Router dans v13.36.0 présente les différences suivantes.
Si vous définissez uniquement les classes du package avec
middlewareGroup('web', [...]), vous remplacez le contenu existant de web. Ne confondez pas cette méthode avec les méthodes d’ajout. De plus, appeler pushMiddlewareToGroup() sur un groupe web inexistant ne restaure pas le groupe web standard.
La détection des doublons des méthodes d’ajout porte sur les valeurs enregistrées. Un alias et un nom de classe désignant la même classe sont des chaînes différentes : au stade du registre, ce sont donc des éléments distincts. Uniformisez la notation et ne supposez pas que la même classe écrite de manières différentes sera dédoublonnée lors de l’enregistrement.
L’ordre d’enregistrement ne garantit pas à lui seul l’ordre d’exécution
Le Router développe les alias et les groupes de middlewares assignés à la route, traite les exclusions, puis les trie selon leur priorité. Un simple ajout au début ou à la fin ne garantit pas un ordre strict par rapport à l’authentification ou à la liaison de modèle de route. En outre,syncMiddlewareToRouter() du HTTP Kernel synchronise les groupes détenus par le Kernel vers le Router via middlewareGroup(). Si la configuration du Kernel est resynchronisée ultérieurement, le contenu des groupes ajouté directement au Router peut être remplacé. Plutôt que de faire dépendre la modification des groupes existants de l’ordre de démarrage des packages, privilégiez une configuration centralisée dans le withMiddleware() de l’application.
Pour les fonctionnalités qui exigent un ordre précis, comme après le démarrage de la session ou après l’authentification, indiquez ce prérequis dans les instructions d’installation et vérifiez-le avec la configuration des priorités de l’application. Évitez qu’un package remplace intégralement la liste des priorités de toute l’application.
Frontières entre cache et vérification
Ne placez pas l’enregistrement des alias dans une conditionroutesAreCached() ni dans un fichier de routes. Lorsqu’un cache existe, loadRoutesFrom() ne charge pas le fichier de routes, mais l’enregistrement reste nécessaire pour résoudre à l’exécution les alias présents dans les routes en cache. Enregistrez-les à chaque fois dans le boot() du service provider.
Si vous modifiez l’assignation des routes, régénérez le cache des routes dans l’application.
-vv sert à développer et vérifier le contenu des groupes. Toutefois, le succès de l’affichage de la liste ne garantit ni le traitement interne du middleware ni l’utilisation des sessions. Des tests de requêtes HTTP sont également nécessaires.
Voici une méthode à ajouter à un test Feature d’une application Laravel qui définit la route /courier-status ci-dessus.
Les tests unitaires qui vérifient l’existence d’un groupe ou le tableau des alias et l’exécution HTTP réelle sont des vérifications distinctes. En particulier, vérifiez le cache non pas en observant simplement le Router du même processus, mais lors d’un nouveau démarrage après la création du cache. Si vous utilisez des workers de longue durée, rechargez-les en suivant votre procédure de déploiement habituelle.
Pages connexes
Middleware
Découvrez les bases de la création, de l’application aux routes, des paramètres et des priorités.
Enregistrement et cache des routes d'un package
Découvrez la relation entre le chargement des routes et la configuration lors de la création du cache.