Включите имя класса при использовании увлажнения массива Doctrine 2

1

В Doctrine 2 есть способ получить режим гидратации массива, чтобы включить имя класса соответствующего объекта в выход, поэтому вместо:

array(
    'id' => 1,
    'name' => 'test',
    // ...
);

Вы получаете:

array(
    '__class' => 'MyProject\MyClass',
    'id' => 1,
    'name' => 'test',
    // ...
);

Я знаю, что класс Doctrine\ORM\Internal\Hydration\ArrayHydrator имеет доступ к соответствующей информации, но я пытаюсь решить, можно ли это сделать без повторной реализации всего ArrayHydrator?

Теги:
doctrine
doctrine2

1 ответ

1
Лучший ответ

Таким образом, создание настраиваемого гидратора, которое расширяет ArrayHydrator и переопределяет метод gatherRowData является одним из возможных решений:

protected function gatherRowData(array $data, array &$id, array &$nonemptyComponents)
{
    $rowData = parent::gatherRowData($data, $id, $nonemptyComponents);

    foreach ($rowData['data'] as $dqlAlias => $data) {
        $class = $this->_rsm->aliasMap[$dqlAlias];
        $meta  = $this->getClassMetadata($class);
        if ($meta->discriminatorMap) {
            $class = $meta->discriminatorMap[$data[$meta->discriminatorColumn['name']]];
        }
        $rowData['data'][$dqlAlias]['__CLASS__'] = $class;
    }

    return $rowData;
}

Интересно узнать, есть ли лучший способ?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню