Wie überprüfe ich, ob eine Route vorhanden ist?

9

In Drupal 8 muss ich überprüfen, ob eine Route in einem benutzerdefinierten Modul vorhanden ist oder nicht. Wie kann ich das erreichen?

harte_behl_0007
quelle

Antworten:

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

RouteProviderInterface::getRouteByName()Gibt ein \Symfony\Component\Routing\RouteObjekt zurück, falls vorhanden, oder löst eine Ausnahme aus, wenn dies nicht der Fall ist.

Sie können verwenden, RouteProviderInterface::getRoutesByNames()wenn Sie keine Ausnahme wünschen.

$exists = count($route_provider->getRoutesByNames(['abc.xyz'])) === 1;
Daniel
quelle
Beachten Sie, dass getRoutesByNames()dies immer noch eine Ausnahme auslösen kann, wenn ein leeres Array als Parameter abgerufen wird. Bei dynamisch erstellten Arrays ist es besser, die Ausnahme abzufangen oder sicherzustellen, dass das an die Methode übergebene Array nicht leer ist.
Kiamlaluno
Vielen Dank an @daniel & Kiamlaluno für die Hilfe aus diesem ...
harte_behl_0007
Danke für die Testmethode! Ich habe ein Kernproblem hinzugefügt, um dies als Methode zu RouteProvider hinzuzufügen: drupal.org/project/drupal/issues/3029545
oknate
6

Um zu überprüfen, ob eine Route vorhanden ist oder nicht, verwenden Sie die folgende Funktion:

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
quelle
1
Da der Code verwendet $thiswird, ist dies keine Funktion, sondern eine Methode einer Klasse. Sie sagen nicht genau, welche Klasse.
Kiamlaluno
1
Auch (null === $router->getRouteCollection()->get($name)) ? false : trueist unnötig kompliziert. Eine ternäre Operation ist nicht erforderlich, da ===bereits ein Boolescher Wert zurückgegeben wird.
Kiamlaluno