mobileka / scope-applicator-laravel
Laravel框架的Scope Applicator绑定。
Requires
- illuminate/database: ~5.1
- illuminate/http: ~5.1
- illuminate/log: ~5.1
- illuminate/support: ~5.1
- mobileka/scope-applicator: 1.1.*
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:21:18 UTC
README
如果您正在寻找与Laravel 4.x.x和5.0.x兼容的版本,请点击这里。
ScopeApplicator为您的Laravel项目带来了优雅的数据排序和过滤方式。
概述
ScopeApplicator是以简单和逻辑的方式实现类似这样功能的方法
/posts
– 返回所有文章列表
/posts?recent
– 仅返回最新文章
/posts?author_id=5
– 返回ID为5的作者的帖子
/posts?author_id=5&order_by_title=desc&status=active
– 仅返回ID为5的作者的活动帖子,并按标题降序排列
要求
Laravel ~5.1
安装
composer require mobileka/scope-applicator-laravel 1.1.*
使用(与模型一起)
在深入之前,请确保您熟悉Laravel的查询作用域
让我们通过例子来学习。首先,我们将为posts
表实现一个author_id
过滤器。
请注意,这将是一个基本的例子,并不是做事的最优方式 ;)
以下步骤是实现这个功能的必要步骤
- 创建一个基本的
PostController
,当您访问/posts
路由时,它会输出帖子列表 - 在
Post
模型中创建一个userId
作用域(并必须扩展Mobileka\ScopeApplicator\Laravel\Model
类) - 告诉ScopeApplicator这个作用域是可用的,并为其提供一个别名
- 访问
/posts?author_id=1
并享受结果
好的,让我们一步步来解决这个问题。
— PostController
<?php namespace App\Http\Controllers; use Illuminate\Routing\Controller; use App\Models\Post; class PostController extends Controller { public function index() { return Post::all(); } }
— Post
模型
<?php namespace App\Models; use Mobileka\ScopeApplicator\Laravel\Model; class Post extends Model { public function scopeUserId($builder, $param = 0) { if (!$param) { return $builder; } return $builder->where('user_id', '=', $param); } }
注意,它扩展了
Mobileka\ScopeApplicator\Laravel\Model
现在我们必须将控制器中的Post::all()
替换为Post::handleScopes()
,并告诉这个方法哪些作用域可用于过滤
<?php namespace App\Http\Controllers; use Illuminate\Routing\Controller; use App\Models\Post; class PostController extends Controller { // an array of available scopes public $scopes = [ 'userId' ]; public function index() { return Post::handleScopes($this->scopes)->get(); } }
请注意,'userId'
与我们创建的Post
模型中的作用域名称匹配(scopeUserId
)。
此时,您可以在posts
表中添加一些示例数据,并确保您可以通过以下路由过滤它:/posts?userId=your_number
但是,因为我们想要author_id
而不是userId
,所以让我们为这个作用域创建一个别名
<?php namespace App\Http\Controllers; use Illuminate\Routing\Controller; use App\Models\Post; class PostController extends Controller { // an array of available scopes public $scopes = [ 'userId' => [ // Here it is! 'alias' => 'author_id' ] ]; public function index() { return Post::handleScopes($this->scopes)->get(); } }
— 这就完成了!现在您可以通过访问/posts?author_id=x
来查看结果。
alias
只是许多可用作用域配置选项之一。这些选项在ScopeApplicator的文档中有详细描述。
更好的使用场景(与存储库一起)
ScopeApplicator还可以与存储库一起使用。它实际上是为这种方式设计的。
为了实现这一点,您的存储库必须扩展Mobileka\ScopeApplicator\Laravel\Repository
类。
ScopeApplicator已经附加到这个类上,因此您将在扩展它的存储库中获得一个新的applyScopes()
方法。
让我们看看一个在扩展上述类之前的BaseRepository
的例子
<?php namespace Acme\Repositories; class BaseRepository { protected $dataProvider; public function __construct($dataProvider) { $this->dataProvider = $dataProvider; } public function getDataProvider() { return $this->dataProvider; } public function all() { return $this->getDataProvider()->all(); } }
DataProvider
通常是一个Model
的实例。
现在,让我们看看带有ScopeApplicator的它是什么样子
<?php namespace Acme\Repositories; use Mobileka\ScopeApplicator\Laravel\Repository; class BaseRepository extends Repository { protected $dataProvider; public function __construct($dataProvider) { $this->dataProvider = $dataProvider; } public function getDataProvider() { return $this->dataProvider; } public function all($scopes = []) { // This part has to be noticed! return $this->applyScopes($this->getDataProvider(), $scopes)->get(); } }
更仔细地关注 all
方法。现在它接受一个作用域数组(与之前传递给 Model::handleScopes()
的同一个数组)。
我们现在使用 applyScopes()
方法,而不是直接在 DataProvider 上调用 all
,该方法接受一个 DataProvider
实例作为第一个参数和一个作用域配置数组作为第二个参数。
贡献
如果你发现了一个错误或有建议,你始终可以创建一个问题或拉取请求(使用 PSR-2)。我们将讨论问题或建议,并共同制定实现计划。
许可证
ScopeApplicator 是一个开源软件,遵循 MIT 许可协议。