faisalrizal / bruno
Requires
- faisalrizal/architect: ~1.0
Requires (Dev)
- mockery/mockery: 0.9.*
- orchestra/testbench: ~3.1
- phpunit/phpunit: ~4.7
- satooshi/php-coveralls: dev-master@dev
README
介绍
一个Laravel基础控制器类和一个特性,可以使您向资源URL添加过滤、排序、预加载和分页。
献给乔尔达诺·布鲁诺
此包以我的英雄乔尔达诺·布鲁诺的名字命名。一个真正的先知,敢于梦想超越人们认为可能的事情。由于他的思想和拒绝放弃他的思想,他在1600年被烧死。我强烈推荐这部关于他生活的短篇卡通,由尼尔·德葛拉斯·泰森讲述:https://vimeo.com/89241669。
功能
- 解析GET参数以动态预加载相关资源、排序和分页
- 使用过滤器组进行资源的高级过滤
- 使用Optimus\Architect进行侧加载、ID加载或嵌入加载相关资源
- ... 欢迎在这里提出新功能建议
教程
要开始使用Bruno,我强烈推荐我的关于Laravel API中的资源控制的文章。
安装
composer require jasahub/bruno
用法
以下示例将是一个假设的资源端点 /books
,它将返回一个属于 Author
的 Book
集合。
Book n ----- 1 Author
可用查询参数
实现
<?php namespace App\Http\Controllers; use Jasahub\EloquentBuilderTrait; use Jasahub\LaravelController; use App\Models\Book; class BookController extends LaravelController { use EloquentBuilderTrait; public function getBooks() { // Parse the resource options given by GET parameters $resourceOptions = $this->parseResourceOptions(); // Start a new query for books using Eloquent query builder // (This would normally live somewhere else, e.g. in a Repository) $query = Book::query(); $this->applyResourceOptions($query, $resourceOptions); $books = $query->get(); // Parse the data using Optimus\Architect $parsedData = $this->parseData($books, $resourceOptions, 'books'); // Create JSON response of parsed data return $this->response($parsedData); } }
语法文档
预加载
简单预加载
/books?includes[]=author
将返回一个包含预加载 Author
的5个 Book
的集合。
ID模式
/books?includes[]=author:ids
将返回一个包含 Book
的集合,其 Author
的ID被预加载。
侧加载模式
/books?includes[]=author:sideload
将返回一个包含 Book
的集合,以及在一个预加载集合中其 Author
的根作用域。
有关预加载类型的更多详细信息,请参阅Optimus\Architect的README。
分页
有两个参数可用:limit
和page
。limit
将确定每页的记录数,而page
将确定当前页。
/books?limit=10&page=3
将返回第30至40本书。
排序
应定义为排序规则的数组。它们将按照定义的顺序应用。
排序规则
示例
[ { "key": "title", "direction": "ASC" }, { "key": "year", "direction": "DESC" } ]
将导致书籍按标题升序排序,然后按年份降序排序。
过滤
应定义为过滤器组的数组。
过滤器组
过滤器
运算符
特殊值
自定义过滤器
记住我们的关系 Books n ----- 1 Author
。想象一下,您想通过 Author
名称过滤书籍。
[ { "filters": [ { "key": "author", "value": "Optimus", "operator": "sw" } ] } ]
现在这一切都很好,然而由于这是一个关系,我们的模型上没有 author
属性。这会导致错误,因为Eloquent会尝试在不存在的 author
属性上使用where子句。我们可以通过实现一个自定义过滤器来解决这个问题。在您使用 EloquentBuilderTrait
的任何地方实现一个名为 filterAuthor
的函数。
public function filterAuthor(Builder $query, $method, $clauseOperator, $value) { // if clauseOperator is idential to false, // we are using a specific SQL method in its place (e.g. `in`, `between`) if ($clauseOperator === false) { call_user_func([$query, $method], 'authors.name', $value); } else { call_user_func([$query, $method], 'authors.name', $clauseOperator, $value); } }
注意:需要指出的是,自定义过滤器将寻找与属性同名的关系。例如,如果尝试为名为 author
的属性使用自定义过滤器,Bruno 将尝试从 Book
模型中懒加载 author
关系。
自定义过滤器函数
示例
[ { "or": true, "filters": [ { "key": "author", "value": "Optimus", "operator": "sw" }, { "key": "author", "value": "Prime", "operator": "ew" } ] } ]
作者名字以 Optimus
开头或以 Prime
结尾的书籍。
[ { "filters": [ { "key": "author", "value": "Brian", "operator": "sw" } ] }, { "filters": [ { "key": "year", "value": 1990, "operator": "gt" }, { "key": "year", "value": 2000, "operator": "lt" } ] } ]
作者名字以 Brian 开头,并且是在 1990 年至 2000 年之间出版的书籍。
可选简写筛选语法(简写)
筛选可以可选地使用简写表示,它将一个给定的筛选数组[key, operator, value, not(可选)]转换为一个在评估后具有详细信息的筛选数组。
例如,这个筛选组(详细)
[ { "or": false, "filters": [ { "key": "author", "value": "Optimus", "operator": "sw" }, { "key": "author", "value": "Prime", "operator": "ew" } { "key": "deleted_at", "value": null, "operator": "eq", "not": true } ] } ]
可以这样表示(简写)
[ { "or": false, "filters": [ ["author", "sw", "Optimus"], ["author", "ew", "Prime"], ["deleted_at", "eq", null, true] ] } ]
标准
此包符合 PSR-1、PSR-2 和 PSR-4。如果您发现符合性疏漏,请通过拉取请求发送补丁。
测试
$ phpunit
贡献
请参阅 CONTRIBUTING 以获取详细信息。
许可
MIT 许可证(MIT)。有关更多信息,请参阅 许可文件。