如何在 YII Restful GET api 上实现过滤?

Mar*_*rk 1 yii2

我正在研究 Yii 的 Restful API。

我的控制器名称是ProductsController,型号是Product

当我像这样调用API时GET /products,我得到了所有产品的列表。

但是,现在我想过滤列表 API 内的记录。

例如,我只想要那些产品名称为 的记录chairs。如何实施?如何在我的 Rest API 上应用正确的过滤。我是新来的。所以,我不知道如何实现这一点。我也遵循了他们的文档但无法理解。

有人可以建议我一个很好的例子或实现这一目标的方法吗?

Biz*_*ley 6

首先,您需要像往常一样在模型中拥有验证规则。

然后是控制器的工作,根据所选的实现,我可以给您一些提示:


如果你的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)

这里发生了什么(数字与代码注释匹配):

  1. 我们正在从正文收集请求参数,
  2. 如果这些是空的,我们从 URL 中获取它们,
  3. 我们正在准备如上所述的 ActiveDataFilter,搜索模型是Product
  4. ActiveDataFilter 对象是使用收集的参数构建的,
  5. 如果构建过程返回,false则意味着存在错误(通常是验证不成功),因此我们将对象返回给用户以查看错误列表,
  6. 如果过滤器不为空,我们会将其应用于数据库查询Product
  7. 最后,我们配置 ActiveDataProvider 对象以返回过滤后的(以及分页和排序的,如果适用)集合。

现在您可以像上面提到的那样使用 DataProvider 过滤器。


如果您ProductsController不使用 DataProvider 来获取集合

您需要创建您的自定义解决方案。