【问题标题】:symfony2.7 pass translator in service containersymfony2.7 在服务容器中传递翻译器
【发布时间】:2015-10-17 15:27:32
【问题描述】:

在 symfony 2.3 中,在 service.yml 中的这一行可以到达翻译器

在 service.yml 中

arguments: [@translator,....

在 serviceFunctions.php 中

 public function __construct(Translator $translator,...) {
    $this->translator = $translator;

现在我得到了错误:

必须是 Symfony\Component\Translation\Translator 的一个实例, Symfony\Component\Translation\DataCollectorTranslator 的实例 给定

我怎样才能在 2.7 的开发模式下也能在生产模式下使用该服务?

【问题讨论】:

  • 下面的答案都不对,去重复问题的链接找答案
  • 遵循重复问题链接中的答案将破坏拥有调试环境的目标,因为您将永远无法使用任何服务的调试版本。只允许您在接口保证您将拥有正确方法时插入特定服务是荒谬的。先生,你做错了。
  • 使用“translator.default”服务将禁用 Symfony 2.6 的新翻译日志功能,所以不,这不是你想要做的。按照所有答案中的建议使用 TranslatorInterface。 @CarlosGranados 请修正你的反对意见。

标签: symfony symfony-2.7


【解决方案1】:

尝试按照以下步骤操作:

类:

use Symfony\Component\Translation\TranslatorInterface;

public function __construct(TranslatorInterface $translator) {
    $this->translator = $translator;
}

public function yourFunction(){
    $this->translator->trans('key', array(), 'yourDomain');
}

服务:

yourService:
        class: yourClass
        arguments: [@translator]
        tags:
            - { name : kernel.event_listener, event: kernel.request, method: yourFunction }

我在我的代码中使用它并且它的工作;)

【讨论】:

    【解决方案2】:

    尝试使用接口而不是实际的翻译器类。通过使用接口作为类型提示,您可以使用任何适合该接口的内容,例如,您可以在开发中传递一个调试翻译器,而在生产中传递一个常规翻译器,而无需更改您的代码。

    use Symfony\Component\Translation\TranslatorInterface;
    
    ...
    
    public function __construct(TranslatorInterface $translator)
    {
        $this->translator = $translator;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 2017-01-02
      • 2021-08-30
      • 2015-05-02
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多