Самый чистый способ идентифицировать объект с отображением наследования Doctrine в zf2

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

// in a controller action:

    // locate the event entity record and determine the event type
    $entity = 'AdminEvents\Entity\Event';
    $event = $this->getEntityManager()->find($entity, $eventID);
    $eventType = $this->getEntityManager()->getClassMetadata(get_class($event))->discriminatorValue;

    // locate the record we're really looking for in the unique extended entity
    $entity = 'AdminEvents\Entity\\' . $eventType;
    $event = $this->getEntityManager()->find($entity, $eventID);

Есть ли более чистый способ сделать это?


person jcropp    schedule 19.02.2015    source источник


Ответы (1)


Вероятно, вам следует определить класс \AdminEvents\Entity\AbsractEvent, если вы еще этого не сделали. Затем каждый из ваших объектов STI должен расширить это, и вы можете выполнить instanceof (или другую логику), чтобы узнать, какой конкретный тип вы получили:

    // locate the record using the AbstractEntity
    $entity = 'AdminEvents\Entity\AbstractEntity';
    $event = $this->getEntityManager()->find($entity, $eventID);

Предостережение: функция SPL, get_class, часто возвращает класс Doctrine Proxy, поэтому не полагайтесь на него напрямую для проверки возвращаемого типа. Вы можете использовать класс Doctrine ClassUtils.

\Doctrine\Common\Util\ClassUtils::getRealClass(get_class($event));
person dualmon    schedule 19.02.2015