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?

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;

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;
}

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.