2012-02-02 102 views
0

我实现了通过实体的关系tanslatable的行为,让我有一个topic实体id属性与OneToMany关系topic_i18n与topic_id, LANG_CODE和内容。管理多个实体,与一对多的关系,在一次

我可以设置一个私人的$语言环境;财产到topic实体为了使主题的实体__toString()方法显示内容/名称或从topic_i18n实体什么? 我怎么能做到这一点?

另一个疑问我有,它可以扩展到OneToMany关系发生的任何情况,就是当我要插入一个新的topic_i18n对象我首先需要创建或 现在有一个topic对象,然后创建国际化的。我对实体服务层/经理没有经验,但我认为我可以使用范例来将两个实体作为一个整体进行管理,但不知道如何继续,或者如果它是正确的方式。有人可以根据他的经验给出暗示,意见或某些东西吗?

感谢先进!

PD:我知道关于主义行为捆绑,但现在不是可能性。

回答

3

我认为你做这件事的方式非常好。

您可以添加/重写一些获取i18n数据的方法,例如getTitle($ locale)(或者get * Whatever *),它会添加一些逻辑,在topic_i18n集合中找到合适的值。

// in your Topic class 
public function getTitle() 
{ 
    return $this 
     ->getTopicI18nCollection() 
     ->findByLocale($this->getLocale()) // actually findByLocale does not exist, you will have to find another way, like iterating over all collection 
     ->getTitle() 
    ; 
} 

与__toString或他人的自动化问题是与现场切换,或如何定义默认语言环境默认使用。

这可以使用doctrine postLoad事件侦听器解决,该侦听器将当前语言环境设置为由EntityManager(http://www.doctrine-project.org/docs/orm/2.1/en/reference/events.html#lifecycle-events)获取的任何实体,例如使用请求或会话信息。

使用Symfony2中,它可能是这样的:

# app/config/config.yml 
services: 
    postload.listener: 
     class: Translatable\LocaleInitializer 
     arguments: [@session] 
     tags: 
      - { name: doctrine.event_listener, event: postLoad } 


// src/Translatable/LocaleInitalizer.php 
class LocaleInitializer 
{ 
    public function __construct(Session $session) 
    { 
     $this->session = $session; 
    } 

    public function postLoad(LifecycleEventArgs $args) 
    { 
     $entity = $args->getEntity(); 
     if ($entity implements TranslatableInterface) { // or whatever check 
      $entity->setLocale($this->session->getLocale()); 
     } 
    } 
} 

最后,你不得到一个主题对象来创建一个新的topic_i18n对象,你可以简单地插入的i18n对象independantly 。 (但你将不得不刷新以前提取的集合)。

+0

非常感谢,您的解释就是我一直在寻找的!你能解释为什么findByLocale()不会存在吗?是由于语言环境是一个私有变量而不是@ORM \列?另一个问题是,为了能够同时管理两个实体,我应该创建一个服务层/管理器,或者只需将所需的字段/变量添加到Topic实体,并将侦听器注册为prepersist事件,然后从实体中获取变量,实例化一个Entity_i18n对象并将它们设置为它?我的意思是我希望能够运行$ t = new Topic(); $ t-> setLocale('es'); $ t-> setContent(foo);并坚持下去 – user846226 2012-02-03 08:10:35

相关问题