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