使用水化器更改对象类型,在分页集合中使用 ZendFramework 2 + Doctrine 2


Change object type with hydrators, inside a pagination collection with ZendFramework 2 + Doctrine 2

我正在构建一个 RESTful API,但我有问题。

目标:我想为来自分页器的集合补水。我的意思是,在集合中,我不想返回项目对象,我想返回 HalResources 的 HalCollection。要创建这些 HalResources,我需要使用 Project 对象(以及其他信息)。

场景:我创建了一个类ProjectHydrator,它使用两种方法实现HydratorInterface:

class ProjectHydrator implements HydratorInterface  {
public function hydrate(array $data, $project){ .... }
public function extract($project) { .... }
}

我将这个水合器连接到我的模块,在模块.config内.php

'phlyrestfully' => array (
'renderer' => array (
    'hydrators' => array (
        'MYPROJECT'Entity'Project' => new 'MYPROJECT'Hydrators'ProjectHydrator()
        )
    ),
    ......
)

并且 fetchAll 侦听器方法 y 以这种方式创建分页:

$dql = 'SELECT e FROM 'MYPROJECT'Entity'Project e';
$query = $this->getEntityManager()->createQuery($dql);  //  Class: 'Doctrine'ORM'Query
$ormPaginator       = new 'Doctrine'ORM'Tools'Pagination'Paginator($query);                         //Class: Doctrine'ORM'Tools'Pagination'Paginator
$doctrinePaginator  = new 'DoctrineORMModule'Paginator'Adapter'DoctrinePaginator($ormPaginator);    //Class: DoctrineORMModule'Paginator'Adapter'DoctrinePaginator
$paginator          = new 'Zend'Paginator'Paginator($doctrinePaginator);                            //Class: Zend'Paginator'Paginator
return $paginator;

问题:水化器正在执行...但称为方法"提取",参数为 Project 对象。在这种方法中,我必须返回和数组,这是我的问题,我想返回一个 HalResource,而不是数组。

我想使用水化器将对象的类型从项目对象(项目实体对象)更改为 HalResource。为了构建这个 HalResource,我想使用 Project 对象和一个带有其他参数的数组。

我做错了什么?有什么想法吗?

谢谢!

无需扩展Doctrine Paginator,只需将查询水合模式设置为水合数组模式即可。

use Doctrine'ORM'Query;
use Doctrine'ORM'Tools'Pagination'Paginator as DoctrinePaginator;
use DoctrineORMModule'Paginator'Adapter'DoctrinePaginator as PaginatorAdapter;
use Zend'Paginator'Paginator;
$dql = 'SELECT e FROM 'MYPROJECT'Entity'Project e';
$query = $this->getEntityManager()->createQuery($dql);
//Set query hydration mode
$query->setHydrationMode(Query::HYDRATE_ARRAY);
$paginator = new Paginator(new PaginatorAdapter(new DoctrinePaginator($query)));
return $paginator;

希望对您有所帮助。