Управление несколькими объектами с помощью отношений OneToMany одновременно - PullRequest
0 голосов
/ 03 февраля 2012

Я реализовал поведение трансляции через отношения сущностей, поэтому у меня есть сущность topic со свойством id со отношением OneToMany к topic_i18n с topic_id, lang_code и content.

Могу ли яустановить частную локаль $;свойство объекта topic для того, чтобы метод __toString () темы отображал содержимое / имя или что-либо из объекта topic_i18n?Как я могу это сделать?

Еще одно сомнение, которое у меня есть, которое может быть распространено на любой контекст, где происходят отношения OneToMany, - это когда я хочу вставить новый объект topic_i18n, который мне сначала нужно создать или в настоящее времяиметь объект topic, а затем создать объект i18n.У меня нет опыта работы со слоями / менеджерами служб сущностей, но я думаю, что мог бы использовать эту парадигму, чтобы иметь возможность управлять обеими сущностями как единым целым, но не знаю, как действовать дальше, или это правильный путь.Может ли кто-нибудь дать намек, мнение или что-то на основании своего опыта?

Спасибо заранее!

PD: Я знаю о связке доктрин поведения, но сейчас это невозможно.

1 Ответ

3 голосов
/ 03 февраля 2012

Я думаю, то, как ты это сделал, довольно хорошо.

Вы можете добавить / переопределить некоторые методы для получения данных 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 независимо. (но вам придется обновить ранее извлеченные коллекции).

...