我试图在Symfony 5.2中重写translator类。我试过了:
# config/services.yaml
services:
# ....
AppTranslator:
decorates: translator
和this (AppTranslator实现TranslatorInterface):
# config/services.yaml
services:
# ....
AppTranslator:
arguments:
$translator: '@translator'
SymfonyContractsTranslationTranslatorInterface: '@AppTranslator'
这两种方法在PHP代码中都能很好地工作,但在开发模式下,翻译服务仍然是DataCollectorTranslator。因此,在小模板中,translator服务仍然没有被覆盖。我该怎么修理它?
有可能我没有理解这个问题。如果某些东西在一种模式下工作,但在另一种模式下不起作用,那么有时只需删除var/cache目录并使用bin/console cache:clear建立一个新的缓存就可以了。
装饰服务有时会有点有趣。我创建了一个新的5.2项目,然后添加:
# src/Translation/Translation.php
namespace AppTranslation;
use JetBrainsPhpStormPure;
use SymfonyComponentTranslationMessageCatalogueInterface;
use SymfonyComponentTranslationTranslatorBagInterface;
use SymfonyContractsTranslationLocaleAwareInterface;
use SymfonyContractsTranslationTranslatorInterface;
use SymfonyBundleFrameworkBundleTranslationTranslator as BaseTranslator;
class Translator implements TranslatorInterface, TranslatorBagInterface, LocaleAwareInterface
{
// Uses PHP8 constructor promotion
public function __construct(private BaseTranslator $translator)
{
}
#[Pure]
public function trans(string $id, array $parameters = [], string $domain = null, string $locale = null): string
{
//return $this->translator->trans($id,$parameters,$domain,$locale);
return strtoupper($id); // Verify calling this class
}
public function getCatalogue(string $locale = null): MessageCatalogueInterface
{
return $this->translator->getCatalogue($locale);
}
#[Pure]
public function getLocale(): string
{
return $this->translator->getLocale();
}
public function setLocale(string $locale)
{
$this->translator->setLocale($locale);
}
}
# config/services.yaml
services:
_defaults:
autowire: true
autoconfigure: true
AppTranslationTranslator:
decorates: translator
# index.html.twig
<li>{{ 'Hello' | trans }}</li>
你可以忽略Pure的东西以及一些PHP8的东西。我也把它用作PHP8测试。
但这一切似乎都像宣传的那样有效。