我正在研究 Yii 的 Restful API。
我的控制器名称是ProductsController,型号是Product。
当我像这样调用API时GET /products,我得到了所有产品的列表。
但是,现在我想过滤列表 API 内的记录。
例如,我只想要那些产品名称为 的记录chairs。如何实施?如何在我的 Rest API 上应用正确的过滤。我是新来的。所以,我不知道如何实现这一点。我也遵循了他们的文档但无法理解。
有人可以建议我一个很好的例子或实现这一目标的方法吗?
首先,您需要像往常一样在模型中拥有验证规则。
然后是控制器的工作,根据所选的实现,我可以给您一些提示:
ProductsController扩展yii\rest\ActiveController基本上是最简单的方法,因为几乎所有东西都已经为你准备好了。您只需要提供$modelClass那里并actions()稍微调整一下方法即可。
public function actions()
{
$actions = parent::actions();
$actions['index']['dataFilter'] = [
'class' => \yii\data\ActiveDataFilter::class,
'searchModel' => $this->modelClass,
];
return $actions;
}
Run Code Online (Sandbox Code Playgroud)
这里我们修改 IndexAction 的配置,它默认负责GET /products请求处理。配置在这里定义,我们只想添加dataFilter配置为使用ActiveDataFilter 的键,它在搜索模型(即我们的Product. 其他动作保持不变。
现在您可以像这样使用DataProvider 过滤器(假设存储产品名称的属性是name):
GET /products?filter[name]=chairs将返回名称为 的所有产品的列表chairs,GET /products?filter[name][like]=chairs将返回 name 包含 word 的所有产品的列表chairs。ProductsController没有扩展yii\rest\ActiveController但您仍在使用 DataProvider 来获取集合希望您ProductsController能够扩展,yii\rest\Controller因为它已经从序列化器和其他实用程序中受益,但这不是必需的。
解决方案与上面相同,但现在您必须自己添加它,因此请确保您的控制器的操作包含如下内容:
$requestParams = \Yii::$app->getRequest()->getBodyParams(); // [1]
if (empty($requestParams)) {
$requestParams = \Yii::$app->getRequest()->getQueryParams(); // [2]
}
$dataFilter = new \yii\data\ActiveDataFilter([
'searchModel' => Product::class // [3]
]);
if ($dataFilter->load($requestParams)) {
$filter = $dataFilter->build(); // [4]
if ($filter === false) { // [5]
return $dataFilter;
}
}
$query = Product::find();
if (!empty($filter)) {
$query->andWhere($filter); // [6]
}
return new \yii\data\ActiveDataProvider([
'query' => $query,
'pagination' => [
'params' => $requestParams,
],
'sort' => [
'params' => $requestParams,
],
]); // [7]
Run Code Online (Sandbox Code Playgroud)
这里发生了什么(数字与代码注释匹配):
Product,false则意味着存在错误(通常是验证不成功),因此我们将对象返回给用户以查看错误列表,Product,现在您可以像上面提到的那样使用 DataProvider 过滤器。
ProductsController不使用 DataProvider 来获取集合您需要创建您的自定义解决方案。
| 归档时间: |
|
| 查看次数: |
2282 次 |
| 最近记录: |