Drupal 9: Как получить полный URL-адрес из маршрута – методы и примеры кода

В Drupal 9 получение полного URL-адреса из маршрута может быть распространенным требованием при создании пользовательских модулей или тем. В этой статье будут рассмотрены различные методы выполнения этой задачи и приведены примеры кода для демонстрации каждого подхода. К концу вы получите четкое представление о том, как получить полный URL-адрес маршрута в Drupal 9.

Метод 1. Использование класса Url и службы LinkGenerator

use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Url;
use Symfony\Component\DependencyInjection\ContainerInterface;
/
 * Custom module service.
 */
class CustomService {
  /
   * The current route match.
   *
   * @var \Drupal\Core\Routing\RouteMatchInterface
   */
  protected $routeMatch;
  /
   * The link generator service.
   *
   * @var \Drupal\Core\LinkGeneratorInterface
   */
  protected $linkGenerator;
  /
   * CustomService constructor.
   *
   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
   *   The current route match.
   * @param \Drupal\Core\LinkGeneratorInterface $link_generator
   *   The link generator service.
   */
  public function __construct(RouteMatchInterface $route_match, LinkGeneratorInterface $link_generator) {
    $this->routeMatch = $route_match;
    $this->linkGenerator = $link_generator;
  }
  /
   * Get the full URL from a route.
   *
   * @param string $route_name
   *   The name of the route.
   *
   * @return string|null
   *   The full URL or NULL if the route does not exist.
   */
  public function getFullUrlFromRoute($route_name) {
    $route_parameters = $this->routeMatch->getRawParameters()->all();
    $url = Url::fromRoute($route_name, $route_parameters);
    return $url ? $url->toString() : NULL;
  }
  /
   * Service constructor.
   *
   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
   *   The container.
   *
   * @return static
   *   The service instance.
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('current_route_match'),
      $container->get('link_generator')
    );
  }
}

Метод 2: использование метода \Drupal::request()

use Symfony\Component\HttpFoundation\RequestStack;
/
 * Custom module service.
 */
class CustomService {
  /
   * The request stack.
   *
   * @var \Symfony\Component\HttpFoundation\RequestStack
   */
  protected $requestStack;
  /
   * CustomService constructor.
   *
   * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
   *   The request stack.
   */
  public function __construct(RequestStack $request_stack) {
    $this->requestStack = $request_stack;
  }
  /
   * Get the full URL from a route.
   *
   * @param string $route_name
   *   The name of the route.
   *
   * @return string|null
   *   The full URL or NULL if the route does not exist.
   */
  public function getFullUrlFromRoute($route_name) {
    $request = $this->requestStack->getCurrentRequest();
    $url = $request->getSchemeAndHttpHost() . $request->getBaseUrl() . '/' . $route_name;
    return $url;
  }
}

В этой статье мы рассмотрели два разных метода получения полного URL-адреса из маршрута в Drupal 9. В первом методе использовался класс Url и служба LinkGenerator, а также система маршрутизации, предоставляемая Drupal. Второй метод включал использование метода \Drupal::request() и RequestStack для получения информации о текущем запросе.

Оба метода имеют свои преимущества и могут использоваться в зависимости от конкретных требований вашего проекта. Используя эти методы, вы можете легко получить полный URL-адрес из маршрута в Drupal 9, улучшая функциональность и удобство вашего веб-сайта.

Не забудьте выбрать метод, который лучше всего соответствует вашим потребностям, и интегрировать его в свои собственные модули или темы. Приятного кодирования!