首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法为ArrayObject类型的对象生成HalResource

无法为ArrayObject类型的对象生成HalResource
EN

Stack Overflow用户
提问于 2019-07-05 00:57:10
回答 1查看 107关注 0票数 0

我在将分页器对象作为HAL json集合返回时遇到了一些问题。我使用的是zend-expressive和zend-expressive-hal的最新版本。

这是我的ConfigProvider中的设置:

代码语言:javascript
运行
复制
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',
        ],
    ];
}

下面是我的处理程序方法:

代码语言:javascript
运行
复制
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类只是分页器的继承:

代码语言:javascript
运行
复制
class RoleCollection extends Paginator
{
}

我得到的错误消息是:

代码语言:javascript
运行
复制
Cannot generate Zend\Expressive\Hal\HalResource for object of type ArrayObject; not in metadata map
EN

回答 1

Stack Overflow用户

发布于 2019-07-10 02:33:49

我认为您缺少角色对象本身的元数据。

例如,类似于my posts对象的内容:

代码语言:javascript
运行
复制
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中。

代码中出错的地方是下面这一行:

代码语言:javascript
运行
复制
$paginator = new RoleCollection(new DbSelect($select, $this->dbAdapter));

这会将查询结果添加到分页器中,但分页器不知道如何处理它。如果我没记错的话,DbSelect返回一个ResultSet。我猜这就是ArrayObject的来源。您可能需要覆盖该ResultSet,并确保它返回一个包含角色对象的数组。您可能需要研究一下the dbselect adapterthe hydrating resultset

一旦在分页器中有了角色对象,就可以在元数据中对其进行描述。

代码语言:javascript
运行
复制
[
    '__class__'      => RouteBasedResourceMetadata::class,
    'resource_class' => UserRole::class,
    'route'          => 'api.roles',
    'extractor'      => ...,
],

我自己对hal使用规则,所以zend-db不在我的范围之内。如果您需要更多帮助,我建议您使用zf forums

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56891975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档