mobileka/scope-applicator-yii2

Yii2框架的Scope Applicator绑定

1.0.3 2016-10-10 00:33 UTC

This package is not auto-updated.

Last update: 2024-09-28 18:16:29 UTC


README

Build Status Code Climate Coverage Status

ScopeApplicator为您的Yii2项目带来了优雅的数据排序和筛选方式。

概览

ScopeApplicator是一种简单且逻辑清晰的方式来实现类似以下功能:

/posts – 返回所有帖子的列表

/posts?recent – 仅返回最新帖子

/posts?author_id=5 – 返回具有id=5的作者的帖子

/posts?author_id=5&order_by_title=desc&status=active – 仅返回属于id=5作者的活跃帖子,并按标题降序排序

要求

– PHP 5.4或更高版本

– Yii 2.0.x

安装

composer require mobileka/scope-applicator-yii2 1.0.*

用法

让我们通过示例来学习。首先,我们将实现为post表创建一个author_id过滤器。

以下是实现这一目标的步骤

  1. 创建一个继承自Mobileka\ScopeApplicator\Yii2\ActiveQueryPostQuery类,并定义一个userId方法
  2. 创建一个继承自Mobileka\ScopeApplicator\Yii2\ModelPost模型,并使其使用PostQuery而不是常规的ActiveQuery
  3. 创建一个基本的PostController,当访问/posts路由时输出帖子列表
  4. 告诉ScopeApplicatoruserId作用域可用,并为其提供一个别名
  5. 访问/posts?author_id=1并享受结果

好的,让我们一步一步来。

— 在app/models/queries目录中创建一个PostQuery类,内容如下

<?php

namespace app\models\queries;

use Mobileka\ScopeApplicator\Yii2\ActiveQuery;

class PostQuery extends ActiveQuery
{
    public function userId($id = 0)
    {
        if ($id) {
            return $this->andWhere(['user_id' => $id]);
        }

        return $this;
    }
}

在以后,我将把userId()方法称为一个userId 作用域

请确保该类继承自Mobileka\ScopeApplicator\Yii2\ActiveQuery

– 创建一个Post模型,并重写find方法如下

<?php

namespace app\models;

use app\models\queries\PostQuery;
use Mobileka\ScopeApplicator\Yii2\Model;
use Yii;

class Post extends Model
{
    public static function find()
    {
        return Yii::createObject(PostQuery::className(), [get_called_class()]);
    }
}

这确保了我们的userId作用域将对Post模型可用。

– 接下来,创建一个PostController

<?php

namespace app\controllers;

use Yii;
use yii\web\Response;
use yii\rest\Controller;
use app\models\Post;

class PostController extends Controller
{
    public function actionIndex()
    {
        return Post::find()->all();
    }

    public function behaviors()
    {
        $behaviors = parent::behaviors();
        $behaviors['contentNegotiator']['formats'] = [
            'application/json' => Response::FORMAT_JSON
        ];

        return $behaviors;
    }
}

在这种情况下,我扩展了yii\rest\Controller,并确保其输出格式设置为JSON。

– 现在让我们修改这个控制器以使其使用ScopeApplicator

<?php

namespace app\controllers;

use Yii;
use yii\web\Response;
use yii\rest\Controller;
use app\models\Post;

class PostController extends Controller
{
    /**
     * Scope configuration array
     */
    protected $scopes = ['userId'];

    public function actionIndex()
    {
        return Post::applyScopes($this->scopes)->all();
    }

    public function behaviors()
    {
        $behaviors = parent::behaviors();
        $behaviors['contentNegotiator']['formats'] = [
            'application/json' => Response::FORMAT_JSON
        ];

        return $behaviors;
    }
}

请注意,我添加了一个新的受保护属性,它描述了可用的作用域。目前我们只有userId

请注意,我已经用Post::applyScopes($this->scopes)替换了Post::find()

如果您已经完成了上述所有步骤,您应该能够填充您的post表,并尝试以下方式过滤数据:/posts?userId=x

但我们希望它是author_id而不是userId,因此我们必须配置我们的作用域并添加一个别名

<?php

namespace app\controllers;

use Yii;
use yii\web\Response;
use yii\rest\Controller;
use app\models\Post;

class PostController extends Controller
{
    /**
     * Scope configuration array
     */
    protected $scopes = [
        'userId' => [
            // here it is!
            'alias' => 'author_id'
        ]
    ];

    public function actionIndex()
    {
        return Post::applyScopes($this->scopes)->all();
    }

    public function behaviors()
    {
        $behaviors = parent::behaviors();
        $behaviors['contentNegotiator']['formats'] = [
            'application/json' => Response::FORMAT_JSON
        ];

        return $behaviors;
    }
}

— 就这样!现在您可以访问/posts?author_id=x并检查结果。

alias只是许多可用的作用域配置选项之一。这些选项在ScopeApplicator的文档中有所描述。

贡献

如果您发现了错误或有所建议,您始终可以创建一个问题或拉取请求(使用PSR-2)。我们将讨论问题或建议,并共同计划实现。

许可证

ScopeApplicator 是一个开源软件,并遵循 MIT 许可协议