¿Cómo verifico que existe una ruta?

9

En Drupal 8, necesito verificar que una ruta exista o no en un módulo personalizado. ¿Cómo puedo conseguir esto?

harsh_behl_0007
fuente

Respuestas:

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

RouteProviderInterface::getRouteByName()devuelve un \Symfony\Component\Routing\Routeobjeto si existe o lanza una excepción si no existe.

Puedes usarlo RouteProviderInterface::getRoutesByNames()si no quieres una excepción.

$exists = count($route_provider->getRoutesByNames(['abc.xyz'])) === 1;
Daniel
fuente
Tenga en cuenta que getRoutesByNames()aún puede generar una excepción, si obtiene una matriz vacía como parámetro. En el caso de las matrices creadas dinámicamente, es mejor atrapar la excepción o verificar que la matriz pasada al método no esté vacía.
kiamlaluno
Gracias aton @daniel & Kiamlaluno por ayudarme con esto ...
harsh_behl_0007
¡Gracias por el método de prueba! He agregado un problema central para agregar esto como método a RouteProvider: drupal.org/project/drupal/issues/3029545
oknate
6

Para verificar la ruta existe o no, utilice la siguiente función:

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
fuente
1
Como el código está usando $this, esa no es una función, sino un método de una clase. No dices exactamente qué clase.
kiamlaluno
1
Además, (null === $router->getRouteCollection()->get($name)) ? false : truees innecesariamente complicado. No hay necesidad de una operación ternaria, ya que ===devuelve un valor booleano.
kiamlaluno