使用Doctrine 2阵列水合时包括类名

时间:2015-09-01 16:05:21

标签: php doctrine-orm doctrine

在Doctrine 2中有一种方法可以让数组水合模式在输出中包含相关实体的类名,所以代替:

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

你得到:

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

我知道Doctrine\ORM\Internal\Hydration\ArrayHydrator班级可以访问相关信息,但是如果可以在不重新实施整个ArrayHydrator的情况下完成此操作,我会尝试解决这个问题吗?

1 个答案:

答案 0 :(得分: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;
}

有兴趣知道是否有更好的方式?