我不知道这是否最佳做法或根本不可能。
因此,在我使用DataTables的情况下,我需要将一个布尔值更改为文本,以显示真假,而不是数字。但我也需要用不同的语言来做。
由于我需要在应用程序中的几个地方这样做,我想我应该做一个特定于应用程序的仓库类,它扩展了EntityRepository,并将它用作我正在构建的存储库的扩展类。为此,为了翻译一些键,我想注入translator对象,但是从来没有设置过翻译:
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);
}
}发布于 2016-07-10 12:48:56
当您将存储库用作服务时,必须使用工厂模式。
见可能的副本:
注意:在最新的SF版本中,语法发生了变化:注入/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')->...发布于 2016-07-10 13:17:32
我发现Matthias的这篇文章在这个问题上很有用。(我知道只有链接才会对答案不屑一顾。)
https://stackoverflow.com/questions/38292012
复制相似问题