Dans un site Drupal, lorsqu’un utilisateur interagit avec le système (par exemple, en accédant à une URL, en soumettant un formulaire, ou en consommant une API), Drupal traite la requête via un cycle d’entrée et de sortie : c’est ce qu’on appelle les processus Inbound et Outbound.
Ces deux mécanismes permettent à Drupal :
Voyons tout cela en détail avec des exemples concrets.
Le Inbound Processing s’applique à tout ce que l’utilisateur envoie vers le système :
GET
, POST
),Imaginons qu’on souhaite rediriger les chemins /produits
vers /product
tout en gardant la logique interne de Drupal.
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class InboundPathSubscriber implements EventSubscriberInterface {
public static function getSubscribedEvents() {
return ['kernel.request' => ['onKernelRequest', 30]];
}
public function onKernelRequest(RequestEvent $event) {
$request = $event->getRequest();
$path = $request->getPathInfo();
if ($path === '/produits') {
$request->server->set('REQUEST_URI', '/product');
}
}
}
Ici, nous utilisons l’événement kernel.request
pour intercepter l’URL avant que Drupal ne résolve le routeur.
Le Outbound Processing intervient lorsque Drupal génère une réponse (HTML, JSON, etc.). Il est souvent utilisé pour :
Url::fromRoute()
),Supposons que vous souhaitiez transformer tous les liens /user/ID
en /profil/ID
lors du rendu HTML :
use Drupal\Core\PathProcessor\OutboundPathProcessorInterface;
use Symfony\Component\HttpFoundation\Request;
use Drupal\Core\Render\BubbleableMetadata;
class OutboundPathProcessor implements OutboundPathProcessorInterface {
public function processOutbound($path, &$options = [], Request $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL) {
if (strpos($path, '/user/') === 0) {
return str_replace('/user/', '/profil/', $path);
}
return $path;
}
}
Déclaration dans services.yml
:
services:
my_module.path_processor.outbound:
class: Drupal\my_module\OutboundPathProcessor
tags:
- { name: path_processor_outbound, priority: 100 }
Situation | Inbound | Outbound |
---|---|---|
Modifier le chemin avant qu’il ne soit résolu | Oui | Non |
Modifier un lien avant de l'afficher | Non | Oui |
Réécrire les paramètres d’une URL | Oui | Oui |
Ajouter des entêtes HTTP | Non | Oui |
Gérer la redirection conditionnelle | Oui | Non |
/fr/produits
pour router vers /en/product
./fr/produits
, /en/product
...).C’est PathProcessorManager
qui orchestre ces opérations dans Drupal Core.
\Drupal::logger()
pour tracer les chemins traités.Les systèmes Inbound et Outbound dans Drupal sont des outils puissants pour contrôler le flux des données HTTP. Que vous créiez un site multilingue, headless, ou que vous souhaitiez personnaliser les chemins de votre site, ces hooks vous donnent un contrôle fin sur l’entrée et la sortie des données — sans modifier le cœur de Drupal.