Comment puis-je vérifier qu'un itinéraire existe?

9

Dans Drupal 8, je dois vérifier qu'une route existe ou non dans un module personnalisé. Comment puis-je atteindre cet objectif?

harsh_behl_0007
la source

Réponses:

10
/* @var \Drupal\Core\Routing\RouteProviderInterface $route_provider */
$route_provider = \Drupal::service('router.route_provider');
$route_provider->getRouteByName('abc.xyz');

RouteProviderInterface::getRouteByName()renvoie un \Symfony\Component\Routing\Routeobjet s'il existe, ou lève une exception dans le cas contraire.

Vous pouvez utiliser RouteProviderInterface::getRoutesByNames()si vous ne voulez pas d'exception.

$exists = count($route_provider->getRoutesByNames(['abc.xyz'])) === 1;
Daniel
la source
Notez que cela getRoutesByNames()peut toujours déclencher une exception, s'il obtient un tableau vide comme paramètre. Dans le cas de tableaux créés dynamiquement, il est préférable d'intercepter l'exception ou de vérifier que le tableau transmis à la méthode n'est pas vide.
kiamlaluno
Merci aton @daniel & Kiamlaluno pour leur aide ...
harsh_behl_0007
Merci pour la méthode de test! J'ai ajouté un problème de base pour l'ajouter en tant que méthode à RouteProvider: drupal.org/project/drupal/issues/3029545
oknate
6

Pour vérifier que l'itinéraire existe ou non, utilisez la fonction ci-dessous:

function routeExists($name)
{
    // I assume that you have a link to the container in your twig extension class
    $router = $this->container->get('router');
    return (null === $router->getRouteCollection()->get($name)) ? false : true;
}
Nikhil Banait
la source
1
Puisque le code utilise $this, ce n'est pas une fonction, mais une méthode d'une classe. Vous ne dites pas quelle classe, exactement.
kiamlaluno
1
En outre, (null === $router->getRouteCollection()->get($name)) ? false : trueest inutilement compliqué. Il n'y a pas besoin d'une opération ternaire, car ===retourne déjà un booléen.
kiamlaluno