【问题标题】:Yii2 activeDataProvider pagination and additional dataYii2 activeDataProvider 分页和附加数据
【发布时间】:2015-09-14 05:05:09
【问题描述】:

我正在构建一个 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() 没有给我 Page-Count 但很容易从其他人那里计算出来。

【问题讨论】:

标签: php rest yii yii2


【解决方案1】:

您可以通过调用$provider->getPagination() 自行将分页标题添加到结果数组中。这是 Pagination-Object 的文档:http://www.yiiframework.com/doc-2.0/yii-data-pagination.html

【讨论】:

  • 感谢 devOp,我已将您的解决方案添加到我的原始问题中。
【解决方案2】:

在你的 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']]
       );

【讨论】:

  • 谢谢。我以后会看看这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多