Я думаю, что вам не хватает метаданных для самого объекта Role.
Например, это что-то похожее на мой объект сообщения:
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. Это должно быть заключено в объект Role, который вы можете добавить в MetadataMap.
Где в вашем коде что-то не так, это строка:
$paginator = new RoleCollection(new DbSelect($select, $this->dbAdapter));
Это добавляет результат запроса в paginator, но paginator не знает, как его обработать. Если я правильно помню, DbSelect возвращает ResultSet. Я предполагаю, что именно отсюда происходит ArrayObject. Вероятно, вам нужно переопределить этот ResultSet и убедиться, что он возвращает массив объектов Role. Возможно, вы захотите взглянуть на адаптер dbselect и набор гидратирующих результатов .
Если у вас есть объект Role в paginator, вы можете описать его в метаданных.
[
'__class__' => RouteBasedResourceMetadata::class,
'resource_class' => UserRole::class,
'route' => 'api.roles',
'extractor' => ...,
],
Я использую доктрину с hal, поэтому zend-db выходит за рамки моей компетенции. Если вам нужна дополнительная помощь, я предлагаю zf форумы .