В Doctrine 2 есть способ получить режим гидратации массива, чтобы включить имя класса соответствующего объекта в выход, поэтому вместо:
array(
'id' => 1,
'name' => 'test',
// ...
);
Вы получаете:
array(
'__class' => 'MyProject\MyClass',
'id' => 1,
'name' => 'test',
// ...
);
Я знаю, что класс Doctrine\ORM\Internal\Hydration\ArrayHydrator
имеет доступ к соответствующей информации, но я пытаюсь решить, можно ли это сделать без повторной реализации всего ArrayHydrator
?
Таким образом, создание настраиваемого гидратора, которое расширяет 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;
}
Интересно узнать, есть ли лучший способ?