Anthony HERVÉ

Ingénieur édudes et développement

Drupal 8 - Accepter les / dans un paramètre d'URL

12/12/2016
Image actualité

J'ai rencontré le problème suivant rapidement dans le cadre d'un projet pro : comment accepter un paramètre avec des slashs dans une route ?

Au début, je me suis dit que j'allais faire comme dans Symfony, mais malheureusement ça n'a pas fonctionné.

Du coup, petite recherche sur le net pour tomber sur ce lien : http://drupal.stackexchange.com/questions/179341/matching-a-route-with-a-file-path.

 

La solution proposée est de créer un service PathProcessor qui permet de modifier les URLs avant de les transmettre au router.

Commencez par créer une classe PathProcessor dans le dossier src/Service avec le code suivant :

<?php

namespace Drupal\custom\Service;


use Drupal\Core\PathProcessor\InboundPathProcessorInterface;
use Symfony\Component\HttpFoundation\Request;

class PathProcessor implements InboundPathProcessorInterface
{
  public function processInbound($path, Request $request)
  {
    if (strpos($path, '/url/test/') === 0) {
      $param = preg_replace('|^\/url\/test\/|', '', $path);
      $value = str_replace('/', ';', $param);
      return "/url/test/" . $value;
    }
    return $path;
  }

}

Dans la fonction processInbound, on commence par intercepter l'URL que l'on souhaite, on récupère le paramètre avec les slashs, on change les slashs par les points virgules (ou autre caractère à votre convenance) puis on renvoie l'URL modifiée.

Comme vous pouvez le remarquer, le paramètre va être transmis avec des points virgules au lieu des slashs. Cela veut dire qu'il faudra faire l'inverse dans le controller qui récupère ce paramètre : changer les points virgules en slashs.

Ensuite, il suffit de créer le service suivant dans le fichier monmodule.services.yaml.

services:
  monmodule.path_processor:
    class: Drupal\custom\Service\PathProcessor
    tags:
      - { name: path_processor_inbound, priority: 200 }

 

Je suis loin d'être sûr que cette solution est la plus optimale, car il faut faire des changements également dans le controller, mais elle a au moins le mérite de fonctionner. ;)

 

Par contre, si vous avez déjà rencontré ce problème et que vous avez une autre solution à proposer, partagez-la dans un commentaire. :-)

url

Commentaires