[英]Yii2 activeDataProvider pagination and additional data
我正在构建 API,但在尝试向结果集添加其他数据时遇到困难。
我在从 ActiveControler 扩展的类中使用 ActiveDataProvider 来获取和返回结果集是 JSON。 它工作得很好,包括分页标题,无需任何工作。
$provider = new \yii\data\ActiveDataProvider([
'query' => Message::find()->where(['location_id' => $id])
]);
return $provider;
但是,如果我首先获得结果以便我可以添加新值,则分页标头不再发送回客户端。
$provider = new \yii\data\ActiveDataProvider([
'query' => Message::find()->where(['location_id' => $id])
]);
$messages['messages'] = $provider->getModels();
$messages['additional_stuff'] = ['field1' => 'foo', 'field2' => 'bar'];
return $messages;
我可能希望输出看起来像的一个例子可能是:
{
"messages": [
{
"id": "1",
"content": "message 1"
},
{
"id": "2",
"content": "message 2"
},
],
"additional_stuff": {
"field1": "foo",
"field2": "bar"
}
}
我可以在这里做什么来添加其他值但确保发送分页标头?
编辑:
感谢 devOp 的响应,我能够根据需要添加标头。 我的操作现在看起来像这样:
$provider = new \yii\data\ActiveDataProvider([
'query' => Message::find()->where(['location_id' => $id])
]);
$messages['messages'] = $provider->getModels();
$messages['additional_stuff'] = ['field1' => 'foo', 'field2' => 'bar'];
$this->sendPaginationHeaders($provider->getHeaders());
return $messages;
在我的新方法中调用:
protected function sendPaginationHeaders($pagination)
{
$pageCount = $pagination->totalCount <= $pagination->getPageSize() ? 1 : ceil($pagination->totalCount / $pagination->getPageSize());
header('X-Pagination-Current-Page: '. $pagination->getPage());
header('X-Pagination-Page-Count: '. $pageCount);
header('X-Pagination-Per-Page: '. $pagination->getPageSize());
header('X-Pagination-Total-Count: '. $pagination->totalCount);
}
它添加了标准的 Yii2 分页标题。 不幸的是 getHeaders() 没有给我页面计数,但很容易从其他人计算出来。
您可以通过调用$provider->getPagination()自己将分页标题添加到结果数组中。 这是分页对象的文档: http : //www.yiiframework.com/doc-2.0/yii-data-pagination.html
在您的 XxxController 中,可能有
// public $serializer = [
// 'class' => 'yii\rest\Serializer',
// 'collectionEnvelope' => 'items',
// ];
像上面一样注释掉这些代码,因此您可以手动调用 new Serializer()->serialize() 并添加任何其他内容
use yii\rest\Serializer;
$provider = new \yii\data\ActiveDataProvider([
'query' => Message::find()->where(['location_id' => $id])
]);
return array_merge(
new Serializer()->serialize($provider),
['additional_stuff' => ['field1' => 'foo', 'field2' => 'bar']]
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.