Что такое личные переводы в расширениях доктрины Gedmo?

В переводимом поведении расширений Gedmo Doctrine есть инструкции на "Личные переводы». Кто-нибудь может пояснить, что такое личные переводы?


person Darryl Hein    schedule 15.07.2015    source источник


Ответы (1)


tl;dr

Персональные переводы используются, когда вы хотите самостоятельно обрабатывать объект перевода (со своей собственной таблицей) вместо поведения по умолчанию, используя одну таблицу для всех переводов.


Используя поведение по умолчанию, вы получаете единую таблицу с именем ext_translations, в которой хранятся все ваши данные перевода. Я приведу вам пример, основанный на документации DoctrineExtensions.

Допустим, мы создаем сущность Article с двумя переводимыми полями — title и content. Это означало бы, что у нас должна быть следующая структура таблицы articles:

+----+-------+---------+
| id | title | content |
+----+-------+---------+

Теперь по умолчанию TranslatableListener устанавливает локаль en_us каждый раз, когда вы создаете новую сущность, таким образом заполняя только таблицу articles:

$article = new Article();
$article->setTitle('Title english');
$article->setContent('Content english');

приведет к следующему:

+----+---------------+-----------------+
| id |     title     |     content     |
+----+---------------+-----------------+
|  1 | Title english | Content english |
+----+---------------+-----------------+

На данный момент только articles обновляются новыми записями, но когда вы хотите перевести эти поля с другой локалью, наша общая таблица ext_translations также обновляется.

Таблица имеет следующую структуру:

+----+--------+---------------+---------+-------------+------------+
| id | locale | object_class  |  field  | foreign_key |  content   |
+----+--------+---------------+---------+-------------+------------+

Итак, что происходит, когда мы обновляем нашу запись новыми переводами:

$article->setTitle('My title');
$article->setContent('My content');
$article->setTranslatableLocale('de_de');

Когда мы сохраняем нашу обновленную сущность, мы получаем следующую структуру в ext_translations:

+----+--------+---------------+---------+-------------+------------+
| id | locale | object_class  |  field  | foreign_key |  content   |
+----+--------+---------------+---------+-------------+------------+
|  1 | de_de  | Bundle\Entity | title   |           1 | My title   |
|  2 | de_de  | Bundle\Entity | content |           1 | My content |
+----+--------+---------------+---------+-------------+------------+

Теперь вы знаете, как работает поведение по умолчанию. Он хранит все ваши переводы (не только одного объекта, а все) в одной таблице.

Но когда вы используете личные переводы, вы можете хранить свои (скажем, для нашего примера) Article переводов в отдельной таблице article_translations.

Если вы знакомы с DoctrineExtensions, предоставленным KnpLabs, то вы уже видели, что означает PersonalTranslations. Ссылку на их документацию по этому вопросу можно найти здесь.

Что ж, надеюсь, это может немного прояснить для вас ситуацию. Дайте мне знать, если у вас возникнут дополнительные вопросы по этому поводу.

person Artamiel    schedule 15.07.2015
comment
Эй, это не совсем правильно. Вам не нужно использовать личные переводы для достижения такого поведения. Персональные переводы предназначены для использования, когда вы хотите фактически контролировать поведение сохраняемости в переводах сущностей в форме набора переводов Array. Теперь вы можете сопоставить коллекцию с сопоставлением onetomany с соответствующим классом преобразования объектов, И теперь вы можете управлять такими вещами, как каскадирование и т. д. Если вы хотите иметь только отдельные таблицы, вы можете сделать это, создав класс преобразования объектов для каждого объекта, как описано в документах - person user3746259; 01.09.2015
comment
Да, короче говоря, использование 1-m - это то, что в основном является конечным результатом. То, что я кратко показал здесь, является поведением по умолчанию с некоторыми пояснениями. Никаких сэмплов или чего-то в этом роде. - person Artamiel; 01.09.2015
comment
Хорошо, просто хотел указать, что есть три возможных способа перевода с gedmo: по умолчанию, таблица для каждого или персональный (включает таблицу для каждого и дополнительные вещи) - person user3746259; 01.09.2015
comment
(конечно, вы можете комбинировать их как хотите, но это рекомендуемые способы) - person user3746259; 01.09.2015