在我的Symfony 2.8项目中,我有一个扩展,为trans方法添加了一些额外的逻辑:
parameters:
translator.class: MyBundle\Twig\TranslationExtension
这个类看起来像这样:
namespace MyBundle\Twig\TranslationExtension;
use Symfony\Bundle\FrameworkBundle\Translation\Translator as BaseTranslator;
class TranslationExtension extends BaseTranslator
{
private $currentLocale;
public function trans($id, array $parameters = array(), $domain = null, $locale = null)
{
$translation = parent::trans($id, $parameters, $domain, $locale);
// Some extra logic here
return $translation;
}
public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
{
return parent::transChoice($id, $number, $parameters, $domain, $locale);
}
}
现在,我正在迁移到Symfony 3,其中不推荐使用这些类参数,但是如何通过覆盖翻译服务来实现这一点?
解决方法:
而不是扩展,最好装饰翻译服务.现在你覆盖了类名,它还将覆盖其他想要装饰服务的包.我看到你因为Twig而使它成为一个扩展,原来的Twig {{trans()}}过滤器也将使用装饰服务.
services:
app.decorating_translator:
class: AppBundle\DecoratingTranslator
decorates: translator
arguments: ['@app.decorating_translator.inner'] # original translator
public: false
请参阅此处有关装饰的文档:http://symfony.com/doc/current/service_container/service_decoration.html