我在将分页器对象作为HAL json集合返回时遇到了一些问题。我使用的是zend-expressive和zend-expressive-hal的最新版本。
这是我的ConfigProvider中的设置:
public function __invoke() : array
{
return [
'dependencies' => $this->getDependencies(),
MetadataMap::class => $this->getHalConfig(),
];
}
public function getHalConfig() : array
{
return [
[
'__class__' => RouteBasedCollectionMetadata::class,
'collection_class' => RoleCollection::class,
'collection_relation' => 'user_roles',
'route' => 'api.user.roles',
],
];
}
下面是我的处理程序方法:
public function get(ServerRequestInterface $request) : ResponseInterface
{
// read some records from the database
$select = new Select();
$select->from(['r' => 'user_roles']);
$select->columns(['id', 'name']);
$paginator = new RoleCollection(new DbSelect($select, $this->dbAdapter));
$paginator->setItemCountPerPage(25);
$paginator->setCurrentPageNumber(1);
return $this->createResponse($request, $paginator);
}
private function createResponse(ServerRequestInterface $request, $instance) : ResponseInterface
{
return $this->responseFactory->createResponse(
$request,
$this->resourceGenerator->fromObject($instance, $request)
);
}
RoleCollection类只是分页器的继承:
class RoleCollection extends Paginator
{
}
我得到的错误消息是:
Cannot generate Zend\Expressive\Hal\HalResource for object of type ArrayObject; not in metadata map
发布于 2019-07-10 02:33:49
我认为您缺少角色对象本身的元数据。
例如,类似于my posts对象的内容:
MetadataMap::class => [
[
'__class__' => RouteBasedCollectionMetadata::class,
'collection_class' => Posts::class,
'collection_relation' => 'posts',
'route' => 'api.posts',
],
[
'__class__' => RouteBasedResourceMetadata::class,
'resource_class' => Post::class,
'route' => 'api.posts.view',
'extractor' => ArraySerializable::class,
],
],
您只描述了集合,并且缺少单个角色的资源类。
我还看到资源生成器尝试解析ArrayObject。这应该包装在一个角色对象中,您可以将其添加到MetadataMap中。
代码中出错的地方是下面这一行:
$paginator = new RoleCollection(new DbSelect($select, $this->dbAdapter));
这会将查询结果添加到分页器中,但分页器不知道如何处理它。如果我没记错的话,DbSelect返回一个ResultSet。我猜这就是ArrayObject的来源。您可能需要覆盖该ResultSet,并确保它返回一个包含角色对象的数组。您可能需要研究一下the dbselect adapter和the hydrating resultset。
一旦在分页器中有了角色对象,就可以在元数据中对其进行描述。
[
'__class__' => RouteBasedResourceMetadata::class,
'resource_class' => UserRole::class,
'route' => 'api.roles',
'extractor' => ...,
],
我自己对hal使用规则,所以zend-db不在我的范围之内。如果您需要更多帮助,我建议您使用zf forums。
https://stackoverflow.com/questions/56891975
复制相似问题