Php Yii2 activeDataProvider分页和附加数据

Php Yii2 activeDataProvider分页和附加数据,php,rest,yii,yii2,Php,Rest,Yii,Yii2,我正在构建一个API,但在尝试向结果集添加额外数据时遇到了困难 我在一个类中使用ActiveDataProvider,该类从ActiveController扩展来获取并返回结果集JSON。它工作得很好,包括分页标题,而不需要做任何工作 $provider = new \yii\data\ActiveDataProvider([ 'query' => Message::find()->where(['location_id' => $id]) ]); return $p

我正在构建一个API,但在尝试向结果集添加额外数据时遇到了困难

我在一个类中使用ActiveDataProvider,该类从ActiveController扩展来获取并返回结果集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);
}
受保护的函数sendPaginationHeaders($pagination)
{
$pageCount=$pagination->totalCount getPageSize()?1:ceil($pagination->totalCount/$pagination->getPageSize());
标题('X-Pagination-Current-Page:'。$Pagination->getPage());
标题('X-Pagination-Page-Count:'。$pageCount);
页眉('X-Pagination-Per-Page:'。$Pagination->getPageSize());
标题('X-Pagination-Total-Count:'。$Pagination->totalCount);
}

它添加了标准的Yii2分页头。不幸的是,getHeaders()没有给我页面计数,但是很容易从其他页面中计算出来。

您可以通过调用将分页标题添加到生成的数组中。以下是分页对象的文档:

在XXX控制器中,可能有

// 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']]
       );

谢谢devOp,我已经将您的解决方案添加到我的原始问题中。谢谢。我将在将来研究这个问题。$pagination=$dataProvider->pagination$pageCount=$pagination->getPageCount();