【问题标题】:Symfony @Translatable with Entity Manager's refreshSymfony @Translatable 与实体管理器的刷新
【发布时间】:2015-10-30 06:12:52
【问题描述】:

我成功地使用 StofDoctrineExtension Bundle 来处理实体翻译。 因此,我在实体中的属性具有上面的@Translable - 注释。

当我想以特定语言显示具有相关实体(数据库中存在翻译条目)的实体时,出现以下问题:

假设我有一个映射到联系人实体 (OneToOne) 的作者实体,并且我想以“fr_fr”语言显示作者详细信息,我正在使用以下代码:

    $author = ...;
    $author->setTranslatableLocale('fr_fr');
    $this->get('fos_user.entity_manager')->refresh($author);

此代码正在将作者翻译成语言“fr_fr” - 但映射的联系人实体并未翻译成目标语言“fr_fr”。我当然已经在作者实体的联系人映射中使用了 cascade=refresh 选项:

/**
 * @ORM\OneToOne(targetEntity="AuthorContact", inversedBy="author", 
   cascade={"persist", "remove", "refresh"})
 * @ORM\JoinColumn(name="contact_id", referencedColumnName="id")
 */
protected $contact;

当我在控制器中使用以下“额外行”为作者获取时,我得到了两个实体的翻译:

    $author = ...;
    $author->setTranslatableLocale('fr_fr');
    $author->getContact()->setTranslatableLocale('fr_fr');
    $this->get('fos_user.entity_manager')->refresh($author);
    $this->get('fos_user.entity_manager')->refresh($author->getContact());

按照我的口味,这有点难看,为什么无论如何使用“cascade=refresh”选项都不起作用?

@edit:我觉得这是级联刷新的bug?

问候。

【问题讨论】:

    标签: php symfony doctrine-orm internationalization entitymanager


    【解决方案1】:

    问题不是级联持续存在,而是级联本地化。文档中没有提到这种能力。在您的情况下,翻译由TranslatableListener 在postLoad 事件中完成。使用getTranslatableLocale 方法来定义语言环境。

    有几种方法可以使上述代码工作。

    1. 在setTranslatableLocale方法中定义级联保存

      公共函数 setTranslatableLocale($locale) { $this->locale = $locale; $this->contact->setTranslatableLocale($locale); }

    2. 不要使用@Locale注解,依赖TranslatableListener的locale:

      $this->translatableListener->setTranslatableLocale('fr_fr');

    这对TranslatableListener 和TranslationWalker 都适用。对于后者,您还可以使用语言环境设置提示 - 这将强制加载所需语言环境中的所有实体。

    $query->setHint( \Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, 'fr_fr' );

    link

    1. 覆盖TranslatableListener

    【讨论】:

    • 非常感谢,我将采用您的第一种方法,即使其他两种方法听起来也很不错 :) 也许以后,当我处理好“提示”时,我会采用“提示方法”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2012-03-14
    • 2015-06-14
    • 1970-01-01
    相关资源
    最近更新 更多