Использование EntityManager внутри объектов Doctrine 2.0

У меня есть 2 объекта: Country (id, name) и Mapping (id, object, internalId, externalId). Страна и сопоставление не связаны с ассоциациями (поскольку Mapping имеет строки не только для страны). Мне нужно получить внешний идентификатор для страны, используя следующие условия:

  • country.id = mapping.internalId
  • mapping.object = 'country'

Поэтому я планирую добавить функцию getExternalId () в Страну

 function getExternalId() { $em = Registry::getEntityManager(); $mapping = $em->getRepository('Mapping')->findOneBy(array( 'object' => 'country', 'internalId' => $this->getId() )); return !empty($mapping) ? $mapping->getExternalId() : false; } 

Вопросов:

  1. Хорошо ли использовать EntityManager внутри сущностей? Если нет, объясните, как получить внешний идентификатор в моем случае?
  2. Может быть, можно связать страну и картографию с помощью файлов yaml?

Заранее спасибо!

    Не рекомендуется позволять объекту объекта полагаться на диспетчер объектов. Он связывает сущность с уровнем персистентности, что было проблемой, которую специально пыталась решить Doctrine 2. Самая большая проблема, связанная с менеджером сущности, заключается в том, что она делает вашу модель жестко протестированной изолированно от базы данных.

    Вероятно, вы должны полагаться на объекты сервиса для обработки операций, которые полагаются на диспетчер объектов.

     // CountryService public function getExternalId($country) {} 

    Кроме того, вы можете создать прокси-методы на своей модели, чтобы вызвать объект службы, который установлен извне. Объект службы будет намного проще издеваться во время тестирования, чем менеджер объектов.

     $country->setService($countryService); $country->getExternalId(); // Country public function getExternalId() { $this->_service->getExternalId($this); } 

    Это может быть не самая лучшая идея, но есть простой способ сделать это.

    Класс UnitOfWork в доктрине будет гидратировать любой объект, который реализует ObjectManagerAware с менеджером сущностей и метаданных classа для этого объекта.

    Все, что вам нужно сделать, чтобы заставить суппорт объекта в вашей сущности реализовать интерфейс, как показано в следующем примере:

     use Doctrine\Common\Persistence\Mapping\ClassMetadata; use Doctrine\Common\Persistence\ObjectManager; use Doctrine\Common\Persistence\ObjectManagerAware; /** * @ORM\Entity */ class MyEntity implements ObjectManagerAware { public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata) { $this->em = $objectManager; } } 

    Если вы создаете новый объект, а не запрашиваете его из базы данных, вам нужно будет установить диспетчер сущности вручную, например, с помощью метода setter.

    Я думаю, что вам нужно использовать репозитории Entity. Они подробно описаны в документации, хотя немного сложно найти информацию. Вот ссылка на статью « Начало работы», в которой описаны способы создания «репозитория» функций «доступа» для ваших объектов.

    Кроме того, здесь приведен некоторый псевдокод, чтобы вы начали:

      

    Немного передовое дополнение к этому (PHP 5.4 находится в альфа-2 во время этого сообщения), который может быть полезен в будущем:

    Вот несколько примеров использования php 5.4 признаков в Doctrine2; один из которых называется активным объектом и обеспечивает активную функциональность стиля записи в Doctrine 2, включая доступ к диспетчеру сущности изнутри объекта.

    Interesting Posts

    Управляйте другим приложением с помощью C #

    Замена 32-битного счетчика циклов на 64-битные значения приводит к сумасшедшим отклонениям производительности

    Загрузка нескольких файлов одновременно?

    Ошибка: не удалось найти оболочку gradleиента в Android SDK. Возможно, вам нужно обновить Android SDK – Android

    jQuery: скрыть всплывающее окно, если щелчок обнаружен в другом месте

    как вычислить сходство между двумя строками в MYSQL

    как изменить кодировку исходного файла в проекте csharp (visual studio / msbuild machine)?

    Как проверить, есть ли плохой сектор на внешнем жестком диске USB на OS X?

    Как определить, какую графическую карту я использую?

    Используя операционную систему приманки, с другой ОС, скрытой TrueCrypt?

    Как далеко кабель HDMI может передавать сигнал 1080p + звук, пока он не станет потерянным?

    Неподтвержденное исключение Java

    Разница между передачей массива и указателем на функцию в C

    Как я могу выйти из открытой, удаленной сессии SSH?

    Компьютер загружается на черный экран PXE, затем сообщает «нет загрузочного устройства»,

    Давайте будем гением компьютера.