如何在Symfony CLI命令上设置区域设置?

t30tvxxf  于 2023-05-18  发布在  其他
关注(0)|答案(2)|浏览(109)

我运行一个多语言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命令上设置区域设置?

nwnhqdif

nwnhqdif1#

设置区域设置对于控制台应用程序没有太大意义。有区域设置的是 user request,在命令行运行期间没有请求。
但你希望似乎是能够获得与适当的区域设置的URL:
然后,直接从文档中:
当路由被本地化时,Symfony默认使用当前请求区域设置。如果要显式设置区域设置,则传递不同的'_locale'值
例如:

$aboutUrlIt = $this->router->generate('app_cms_about', ['_locale' => 'it']);

您在注解中提到了设置default_locale,并且由于您可以更改这个设置,这意味着控制台应用程序“设置了一个区域设置”。但你从这方面得出了错误的结论:此设置用于在请求中没有设置语言环境的情况下设置默认语言环境。或者,例如,当 there is no request 时,如在命令行应用程序中。
不能在运行时更改该设置,因为该设置是编译容器的一部分,该容器在应用程序运行之前编译。

sr4lhrrt

sr4lhrrt2#

在Symfony调用xdebug之后,我找到了我正在寻找的解决方案。我构建了一个监听器作为我通过Web使用的监听器:

services:
    App\EventListener\CommandStartListener:
        tags:
            - { name: kernel.event_listener, method: onCommandStart,  event: console.command }
<?php
namespace App\EventListener;

use Symfony\Component\Console\Event\ConsoleCommandEvent;
use Symfony\Component\Routing\RouterInterface;

class CommandStartListener
{
    protected RouterInterface $router;

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

    public function onCommandStart(ConsoleCommandEvent $event) : ?string
    {
       //  ... checks and stuff ...

        try {

            $lnParam = $event->getInput()->getArgument("app_language");

        } catch( \Exception $ex) {

            return null;
        }

        $this->router->getContext()->setParameter('_locale', $lnParam);
        return $lnParam;
    }
}

这使得任何urlGenerator->generate()行为正常。
给@Yivi的帽子小费,因为它给我指明了正确的方向。

相关问题