Rest Apigility:如何渲染嵌入对象?
如何在Apigility中渲染嵌入对象?例如,如果我有一个“user”对象,它构成了一个“country”对象,那么我应该将“country”对象呈现为嵌入对象吗?我该怎么做 我使用的是Rest Apigility:如何渲染嵌入对象?,rest,laminas-api-tools,Rest,Laminas Api Tools,如何在Apigility中渲染嵌入对象?例如,如果我有一个“user”对象,它构成了一个“country”对象,那么我应该将“country”对象呈现为嵌入对象吗?我该怎么做 我使用的是Zend\Stdlib\Hydrator\arrayserizable。我的getArrayCopy()方法只返回我想要公开的属性数组。数组键是属性名。数组值是属性值。对于user->country,值是一个对象,而不是标量 当我从UserResource->fetch()返回用户对象时,它的呈现方式如下: {
Zend\Stdlib\Hydrator\arrayserizable
。我的getArrayCopy()
方法只返回我想要公开的属性数组。数组键是属性名。数组值是属性值。对于user->country
,值是一个对象,而不是标量
当我从UserResource->fetch()
返回用户对象时,它的呈现方式如下:
{
"id": "1",
"firstName": "Joe",
"lastName": "Bloggs",
"status": "Active",
"email": "test@example.com",
"country": {
"code": "AU",
"name": "Australia"
},
"settings": "0",
"_links": {
"self": {
"href": "http://api.mydomain.local/users/1"
}
}
}
请注意,“国家”不在嵌入的\u
字段中。如果它应该在\u embedded
中,我会认为Apigility会自动这样做(因为它会自动添加\u links
对象)
作为一个相关问题,我如何返回其他rel链接,如后退、前进等?获得呈现嵌入式资源能力的最简单方法是当存在与嵌入式对象关联的API/资源时。对于您的示例,我的意思是您将拥有一个API资源,该资源具有一个国家实体。在这种情况下,如果getArrayCopy返回CountryEntity的值,Apigility将自动将其作为嵌入式资源呈现 如果您的getArrayCopy以带有代码和名称的数组的形式返回country,那么您将得到您看到的结果 对于另一部分,当您返回分页器时,first、last、prev和next的rel链接将来自fetchAll方法。您的集合已从此扩展,但它需要适配器。代码可能如下所示:
public function fetchAll($params)
{
// Return a \Zend\Db\Select object that will retrieve the
// stuff you want from the database
$select = $this->service->fetchAll($params);
$entityClass = $this->getEntityClass();
$entity = new $entityClass();
$hydrator = new \Zend\Stdlib\ArraySerializable();
$prototype = new \Zend\Db\ResultSet\HydratingResultSet($hydrator, $entity);
$paginator = new \Zend\Paginator\Adapter\DbSelect($select, $this->sql, $prototype);
$collectionClass = $this->getCollectionClass();
return new $collectionClass($paginator);
}
还有其他分页器适配器-一个ArrayAdapter,它将接收一个数组,不管它有多大,然后对它进行分页,这样您就只能得到所需数量的结果。如果将其用于数据库结果,则可能会检索和丢弃大量结果。DbSelect分页器将修改$select对象以自动添加limit和order子句,这样您就可以只检索所需的位。如果您使用的是DbTableGateway、迭代器甚至回调,那么也有适配器。当然,您也可以实现自己的
希望这有帮助。如果您有更具体的需求或澄清,请发表评论,我会尽我所能。我在github上发布了这个示例
希望这有帮助。谢谢大卫,看起来很棒。我明天要试一试。