Как генерировать URL из консоли

Дата обновления перевода 2023-07-20

Как генерировать URL из консоли

К сожалению, контекст командной строки не знает о вашем VirtualHost или имени домена. Это означает, что если вы генерируете абсолютный URL в консольной команде, то вы скорее всего получите что-то вроде http://localhost/foo/bar, что не очень полезно.

Чтобы исправить это, вам нужно сконфигурировать "контекст запроса", то есть, простыми словами - сконфигурировать ваше окружение так, чтобы оно знало, какой URL ему использовать при генерировании URL.

Существует два способа конфигурации контекста запроса: на уровне приложения и по-командно.

Глобальная конфигурация контекста запроса

Чтобы сконфигурировать контекст запроса, который используется генератором URL, вы можете переопределить параметры, которые он использует как значения по умолчанию, чтобы изменить хост (localhost) и схему (http) по умолчанию. Вы также можете сконфигурировать базовый путь, если Symfony работает не в корневом каталоге.

Отметьте, что это не влияет на URL, сгенерированные через обычные веб-запросы, так как они будут переопределены по умолчанию.

1
2
3
4
5
# config/services.yaml
parameters:
    router.request_context.host: example.org
    router.request_context.scheme: https
    router.request_context.base_url: my/path

Конфигурация контекста запроса по-командно

Чтобы изменить это только в одной команде, вы можете просто вызвать контекст запроса из сервиса маршрутизатора и переопределить его настройки:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// src/Command/DemoCommand.php
use Symfony\Component\Routing\RouterInterface;
// ...

class DemoCommand extends ContainerAwareCommand
{
    private $router;

    public function __construct(RouterInterface $router)
    {
        $this->router = $router;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $context = $this->router->getContext();
        $context->setHost('example.com');
        $context->setScheme('https');
        $context->setBaseUrl('my/path');

        $url = $this->router->generate('route-name', array('param-name' => 'param-value'));
        // ...
    }
}