В переводимом поведении расширений Gedmo Doctrine есть инструкции на "Личные переводы». Кто-нибудь может пояснить, что такое личные переводы?
Что такое личные переводы в расширениях доктрины Gedmo?
Ответы (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
. Ссылку на их документацию по этому вопросу можно найти здесь.
Что ж, надеюсь, это может немного прояснить для вас ситуацию. Дайте мне знать, если у вас возникнут дополнительные вопросы по этому поводу.
1-m
- это то, что в основном является конечным результатом. То, что я кратко показал здесь, является поведением по умолчанию с некоторыми пояснениями. Никаких сэмплов или чего-то в этом роде.
- person Artamiel; 01.09.2015