Como verifico se existe uma rota?

9

No Drupal 8, preciso verificar se existe uma rota ou não em um módulo personalizado. Como posso conseguir isso?

harsh_behl_0007
fonte

Respostas:

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

RouteProviderInterface::getRouteByName()retorna um \Symfony\Component\Routing\Routeobjeto, se existir, ou lança uma exceção, se não existir.

Você pode usar RouteProviderInterface::getRoutesByNames()se não desejar uma exceção.

$exists = count($route_provider->getRoutesByNames(['abc.xyz'])) === 1;
Daniel
fonte
Observe que getRoutesByNames()ainda pode gerar uma exceção, se ela obtiver uma matriz vazia como parâmetro. No caso de matrizes criadas dinamicamente, é melhor capturar a exceção ou verificar se a matriz passada para o método não está vazia.
kiamlaluno
Graças aton @ Daniel & Kiamlaluno para ajudar fora deste ...
harsh_behl_0007
Obrigado pelo método de teste! Eu adicionei uma questão central para adicionar este como um método para RouteProvider: drupal.org/project/drupal/issues/3029545
oknate
6

Para verificar se a rota existe ou não use a função abaixo:

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
fonte
11
Como o código está usando $this, isso não é uma função, mas um método de uma classe. Você não diz exatamente qual classe.
kiamlaluno
11
Além disso, (null === $router->getRouteCollection()->get($name)) ? false : trueé desnecessariamente complicado. Não há necessidade de uma operação ternária, pois ===já retorna um booleano.
kiamlaluno