Làm cách nào để xác minh một tuyến đường tồn tại?


9

Trong Drupal 8, tôi cần xác minh một tuyến có tồn tại hay không trong một mô-đun tùy chỉnh. Làm thế nào tôi có thể đạt được điều này?

Câu trả lời:


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

RouteProviderInterface::getRouteByName()trả về một \Symfony\Component\Routing\Routeđối tượng nếu nó tồn tại hoặc ném ngoại lệ nếu nó không tồn tại.

Bạn có thể sử dụng RouteProviderInterface::getRoutesByNames()nếu bạn không muốn có ngoại lệ.

$exists = count($route_provider->getRoutesByNames(['abc.xyz'])) === 1;

Lưu ý rằng getRoutesByNames()vẫn có thể đưa ra một ngoại lệ, nếu nó nhận được một mảng trống làm tham số. Trong trường hợp các mảng được tạo động, tốt hơn hết là bẫy ngoại lệ hoặc xác minh mảng được truyền cho phương thức không trống.
kiamlaluno

Cảm ơn aton @daniel & Kiamlaluno đã giúp đỡ trong việc này ...
khắc nghiệt_behl_0007

Cảm ơn phương pháp thử nghiệm! Tôi đã thêm một vấn đề cốt lõi để thêm vấn đề này như một phương thức vào RouteProvider: drupal.org/project/drupal/issues/3029545
oknate

6

Để kiểm tra tuyến tồn tại hay không sử dụng chức năng dưới đây:

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
Vì mã đang sử dụng $this, đó không phải là một hàm, mà là một phương thức của một lớp. Bạn không nói chính xác lớp nào.
kiamlaluno

1
Ngoài ra, (null === $router->getRouteCollection()->get($name)) ? false : truelà phức tạp không cần thiết. Không cần một hoạt động ternary, vì ===trả về đã là một boolean.
kiamlaluno
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.