mobileka / scope-applicator-yii2
Yii2框架的Scope Applicator绑定
Requires
- php: >=5.4.0
- mobileka/scope-applicator: 1.1.*
- yiisoft/yii2: 2.0.*
Requires (Dev)
- mockery/mockery: 0.9.3
- phpunit/phpunit: 4.1.*
- satooshi/php-coveralls: 0.6.1
This package is not auto-updated.
Last update: 2024-09-28 18:16:29 UTC
README
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
过滤器。
以下是实现这一目标的步骤
- 创建一个继承自
Mobileka\ScopeApplicator\Yii2\ActiveQuery
的PostQuery
类,并定义一个userId
方法 - 创建一个继承自
Mobileka\ScopeApplicator\Yii2\Model
的Post
模型,并使其使用PostQuery
而不是常规的ActiveQuery
- 创建一个基本的
PostController
,当访问/posts
路由时输出帖子列表 - 告诉ScopeApplicator
userId
作用域可用,并为其提供一个别名 - 访问
/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 许可协议。