Как мне проверить, существует ли маршрут?

9

В Drupal 8 мне нужно проверить, существует ли маршрут в пользовательском модуле или нет. Как мне этого добиться?

harsh_behl_0007
источник

Ответы:

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

RouteProviderInterface::getRouteByName()возвращает \Symfony\Component\Routing\Routeобъект, если он существует, или выдает исключение, если это не так.

Вы можете использовать, RouteProviderInterface::getRoutesByNames()если вы не хотите исключения.

$exists = count($route_provider->getRoutesByNames(['abc.xyz'])) === 1;
Даниил
источник
Обратите внимание, что getRoutesByNames()все еще может вызвать исключение, если он получает пустой массив в качестве параметра. В случае динамически создаваемых массивов лучше перехватить исключение или убедиться, что массив, переданный методу, не пуст.
kiamlaluno
Спасибо aton @daniel & Kiamlaluno за помощь в этом ...
harsh_behl_0007
Спасибо за метод тестирования! Я добавил основную проблему, чтобы добавить это как метод к RouteProvider: drupal.org/project/drupal/issues/3029545
oknate
6

Для проверки наличия или отсутствия маршрута используйте следующую функцию:

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;
}
Нихил Банайт
источник
1
Поскольку код использует $this, это не функция, а метод класса. Вы не говорите, какой класс, точно.
kiamlaluno
1
Кроме того, (null === $router->getRouteCollection()->get($name)) ? false : trueэто излишне сложно. Нет необходимости в троичной операции, так как ===возвращает уже логическое значение.
kiamlaluno