我运行一个多语言Symfony 4.4网站,其中的区域设置是URL的一部分。所以我有/it/
,/fr/
等等。
我的路线看起来像这样:
/**
* @Route({
* "it": "/it/azienda/",
* "es": "/es/empresa/"
* }, name="app_cms_about")
*/
然后我有一个设置正确区域设置的pre-controller事件:
public function onRouteRequest(ControllerEvent $event)
{
// ... checks and stuff ...
$event->getRequest()->setLocale($ln);
}
通过Web,一切都按预期工作,但现在我需要在CLI命令中管理这种语言差异:基本上,这意味着当我从CLI运行$this->urlGenerator->generate('app_cms_about')
时,我希望获得基于区域设置的URL。
用户必须将区域设置作为参数传递给CLI命令:
protected function configure()
{
$this->addArgument(
"app_language",
InputArgument::REQUIRED,
'The site to run on: `it`, `es`, ...');
}
现在我只需要把它设置在某种程度上。我很想用一个事件来实现,但是当然CLI事件中没有getRequest()
来设置区域设置。
如何在Symfony 4 CLI命令上设置区域设置?
2条答案
按热度按时间nwnhqdif1#
设置区域设置对于控制台应用程序没有太大意义。有区域设置的是 user request,在命令行运行期间没有请求。
但你希望似乎是能够获得与适当的区域设置的URL:
然后,直接从文档中:
当路由被本地化时,Symfony默认使用当前请求区域设置。如果要显式设置区域设置,则传递不同的'_locale'值
例如:
您在注解中提到了设置
default_locale
,并且由于您可以更改这个设置,这意味着控制台应用程序“设置了一个区域设置”。但你从这方面得出了错误的结论:此设置用于在请求中没有设置语言环境的情况下设置默认语言环境。或者,例如,当 there is no request 时,如在命令行应用程序中。不能在运行时更改该设置,因为该设置是编译容器的一部分,该容器在应用程序运行之前编译。
sr4lhrrt2#
在Symfony调用xdebug之后,我找到了我正在寻找的解决方案。我构建了一个监听器作为我通过Web使用的监听器:
这使得任何
urlGenerator->generate()
行为正常。给@Yivi的帽子小费,因为它给我指明了正确的方向。