Symfony @Transhable с обновлением Entity Manager

Я успешно использую 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: я думаю, что это ошибка каскадного обновления?

С уважением.

1

Решение

Проблема заключается не в сохранении каскада, а в каскадной локализации. Там нет такой способности, упомянутой в документах. В вашем случае перевод выполняется TranslatableListener в postLoad событие. Определить локаль getTranslatableLocale метод используется.

Есть несколько способов заставить вышеуказанный код работать.

  1. Определите каскадное сохранение в setTranslatableLocale метод

    публичная функция setTranslatableLocale ($ locale)
    {
    $ this-> locale = $ locale;
    $ This-> контактно> setTranslatableLocale ($ локали);
    }

  2. Не используйте @Locale аннотации и полагаться на locale из TranslatableListener:

    $ This-> translatableListener-> setTranslatableLocale ( ‘fr_FR’);

Это будет работать для обоих: TranslatableListener а также TranslationWalker, Для последнего вы также можете установить подсказку с локалью — это заставит загружать все сущности в нужной локали.

$ Query-> setHint (
\ Gedmo \ Translatable \ TranslatableListener :: HINT_TRANSLATABLE_LOCALE,
‘а как’
);

ссылка на сайт

  1. Переопределить TranslatableListener
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector