【问题标题】:Symfony Customrepository inject translatorSymfony Customrepository 注入翻译器
【发布时间】:2016-07-10 12:44:22
【问题描述】:

我不确定这是否是最佳实践或是否可行。

所以我有一种情况,我使用DataTables,我需要将布尔值更改为文本,以便显示真/假而不是数字。但我也需要用不同的语言来做。

由于我在应用程序的几个地方都需要这个,我想我应该创建一个应用程序特定的 Repository 类来扩展 EntityRepository 并将它用作我正在构建的存储库的扩展类。为此,我想注入翻译器对象以翻译一些键,但从未设置翻译:

CustomRepository 类

class CustomRepository extends EntityRepository
{
    /**
     * @var Translator
     */
    protected $translator;

    /**
     * @param Translator $translator
     */
    public function setTranslator(Translator $translator)
    {
        $this->translator = $translator; //*******this one is not set...
    }

    /**
     * Replace bool results into string values
     *
     * @param $aRes
     * @param $sField
     *
     * @return mixed
     */
    protected function _replaceBoolToStringResult(&$aRes, $sField)
    {
        if (1 == $aRes[$sField]) {
            $aRes[$sField] = str_replace('1', $this->translator->trans('site.true'), $aRes[$sField]);
        } else {
            $aRes[$sField] = str_replace('0', $this->translator->trans('site.false'), $aRes[$sField]);
        }

        return $aRes;
    }
}

services.yml

app.custom.repository:
        class: App\CommonBundle\Repository\CustomRepository
        #should i call here all the constructor vars from EntityRepository class as arguments?
        calls:
            - [setTranslator, ["@translator.default"]]

具有自定义 DQL 的存储库

class SettingsRepository extends CustomRepository
{
    public function findOverviewSettingsAsJson()
    {
        $aResult = $this->createQueryBuilder('s')
                        ->select('s.identifier, s.type, s.isActive')
                        ->getQuery()
                        ->getScalarResult();

        // ******** HERE I WANT TO USE _replaceBoolToStringResult

        return json_encode($aResult);
    }
}

【问题讨论】:

    标签: symfony doctrine-orm datatables


    【解决方案1】:

    我发现 Matthias 的 this article 在这个问题上很有用。 (我知道只有链接的答案是不受欢迎的......)

    【讨论】:

      【解决方案2】:

      当您将存储库用作服务时,您必须使用工厂模式。

      查看可能的重复项:

      Symfony 2: Creating a service from a Repository

      How to inject a repository into a service in Symfony2?

      注意:在最新的 SF 版本中语法发生了变化:http://symfony.com/doc/current/components/dependency_injection/factories.html

      编辑: 您应该将存储库用作服务:

      app.custom.repository:
          class: App\CommonBundle\Repository\CustomRepository
          factory: ["@doctrine.orm.entity_manager", getRepository]
          arguments:
              - App\CommonBundle\Entity\CustomEntity
          calls:
              - [setTranslator, ["@translator.default"]]
      

      然后将此服务作为代码中的任何其他服务调用。例如从控制器内部:

      $this->get('app.custom.repository')->...
      

      【讨论】:

      • 我编辑了我的问题,也许现在它更清楚了。我想我并不清楚如何做到这一点......
      • 这个我明白。但我想要实现的是在其他自定义存储库中使用它,而不是在控制器中。
      • 如果你想在另一个存储库中使用它,你必须每次扩展你的CustomRepository,然后为每个存储库创建一个自定义服务。
      • 如果您不想总是扩展您的 CustomRepository,您可以使用trait。但是由于您依赖于外部服务,因此您必须为每个 repo 创建一个repository as a service,或者在需要时手动调用setTranslator。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      • 2023-01-13
      • 1970-01-01
      • 1970-01-01
      • 2014-12-22
      • 2011-07-22
      相关资源
      最近更新 更多