1

我将 Symfony2 与 Doctrine2 一起使用。我想实现以下目标:

 $place = $this->getDoctrine()->getRepository('TETestBundle:Place')->find($id);

在那个地方将是用户语言(会话中)的地方信息(公共数据+文本)。因为我要这样做数百次,所以我想在幕后传递它,而不是作为第二个参数。因此,英语用户将以英语查看地点信息,而西班牙用户则以西班牙语查看。

一种可能性是从 EntityRepository 访问应用程序的语言环境。我知道它是通过服务和 DI 完成的,但我想不通!

// PlaceRepository
class PlaceRepository extends EntityRepository
{
    public function find($id)
    {
        // get locale somehow
        $locale = $this->get('session')->getLocale();

        // do a query with the locale in session
        return $this->_em->createQuery(...);
    }
}

你会怎么做?您能否详细解释一下我必须创建和扩展的步骤和新类?我计划在准备好后发布这个翻译包:)

谢谢!

4

1 回答 1

1

我不相信 Doctrine 是访问会话数据的好方法。ORM 中的开销太大,无法仅提取会话数据。

查看Symfony 2 Cookbook以了解 PDO 支持的会话的配置。

我不会设置服务,而是考虑使用Doctrine 事件侦听器的方法。就在每次查找之前,侦听器会从某个地方(会话、配置或您将来喜欢的任何其他地方)挑选出正确的语言环境,将其注入查询中,就像魔术一样,您的模型不必知道这些细节。保持模型的范围干净。

您不希望您的模型或存储库直接进入会话。如果您将来决定想要一个带有该存储库的命令行工具怎么办?那里有所有的会话杂乱无章,你会一团糟。

教义事件监听器神奇地美味。他们进行了一些实验,但最终成为这种查询操作的一种非常可配置的、偏僻的解决方案。

更新:看起来您最受益的是Doctrine Translatable Extension。它已经为您完成了所有工作,包括注册侦听器、提供挂钩以了解如何传入适当的语言环境(从您保存它的任何地方)等等。我自己使用了 Gedmo 扩展(虽然不是这个特定的),并且发现它们都是高质量的。

于 2012-11-09T07:02:04.563 回答