ルートが存在することを確認するにはどうすればよいですか?


9

Drupal 8では、カスタムモジュールにルートが存在するかどうかを確認する必要があります。どうすればこれを達成できますか?

回答:


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

この問題を解決してくださった@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不必要に複雑です。===はすでにブール値を返すため、3項演算の必要はありません。
kiamlaluno
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.