В 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, улучшая функциональность и удобство вашего веб-сайта.
Не забудьте выбрать метод, который лучше всего соответствует вашим потребностям, и интегрировать его в свои собственные модули или темы. Приятного кодирования!