Symfony Customrepository注入翻译器

时间:2016-07-10 12:44:23

标签: symfony doctrine-orm datatables

我不确定这是否是最佳做法或根本不可能。

所以我有一种情况,我使用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);
    }
}

2 个答案:

答案 0 :(得分:0)

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

请参阅可能的重复项:

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')->...

答案 1 :(得分:0)

我发现马蒂亚斯this article在这个问题上很有用。 (我知道链接只有答案是皱眉......)