Я думаю, то, как ты это сделал, довольно хорошо.
Вы можете добавить / переопределить некоторые методы для получения данных i18n, такие как getTitle ($ locale) (или get * Wh независимо *), которые добавляют некоторую логику для нахождения хорошего значения в коллекции 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 или других заключается в переключении локали или в том, как определить локаль по умолчанию для использования по умолчанию.
Эту проблему можно решить с помощью прослушивателя событий 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 независимо. (но вам придется обновить ранее извлеченные коллекции).