Як генерувати URL з консолі

Дата оновлення перекладу 2023-05-27

Як генерувати 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'));
        // ...
    }
}