cloudmonitor / apiflow
该包已被废弃,不再维护。未建议替代包。
简化您的RESTful API。
v1.1.41
2023-02-14 17:05 UTC
Requires
- php: ^8.0
- illuminate/support: ^9.0|^10.0
README
快速开发RESTful API端点,具有丰富的功能,如关键字查询、分页等。
安装
composer require cloudmonitor/apiflow
准备控制器
类似于Eloquent中的特殊属性,如$fillables,APIFlow允许自定义数组定义的属性。这样,您可以通过API控制数据如何被暴露。
方法
目前APIFlow旨在用于RESTful资源列表,无论是index
还是集合和单个条目show
。可以通过具体引用API资源和Eloquent模型来完成。
class UserController extends APIController { public function index() { return parent::api(\App\Http\Resources\User::class, \App\Models\User::class)->many(); } }
或者,如果名称遵循上述标准约定,即App\Http\Controllers\UserController, \App\Http\Resources\User和 \App\Models\User
class UserController extends APIController { public function index() { return parent::api()->many(); } }
同样,您可以显示单个记录。
class UserController extends APIController { public function show($id) { return parent::api()->one($id); } }
可用的快捷方式还包括
->getIndex()
->getShow($id)
应用额外查询
apply()
可以用来应用额外的过滤器,例如ID小于10。
class UserController extends APIController { public function index() { return parent::api() ->apply(function(Builder $q) { return $q->where('id', '<', 10); }) ->many(); } }
属性
目前支持3个属性
/** * Search query database columns. * * @var array */ protected $queryColumns = ['name', 'email', 'auid']; /** * Model scopes exposed to the API. * * @var array */ protected $scopes = ['departments']; /** * Related models API can include. * * @var array */ protected $withRelations = ['department'];
第一个属性(queryColumns
)告诉APIFlow数据库中它可以进行全文搜索的列。每个列都会进行部分搜索,意味着文本可以围绕搜索字符串(%string%
)。字符串也将被转换为小写,以避免大小写敏感。
第二个属性(scopes
)允许APIFlow对模型的作用域执行查询(public function scopeDepartment()
)。作用域应仅需要两个参数,默认的Builder
和查询字符串参数。第二个参数将始终转换为给定的格式。例如
GET /api/users?departments=1,2
作用域是
public function scopeDepartments(Builder $query, array $departments): void
将转换为数组[1,2]
。
可用功能
目前APIFlow的功能包括
- 关键字搜索(如上所述,用于定义列):
query=
(仅适用于many/getIndex) - 排除ID,如果您想防止查询在列表中已显示的内容:
exclude=
(仅适用于many/getIndex) - 设置输出结果的限制,上限为25:
limit=
(仅适用于many/getIndex) - 加载与模型相关的数据。用逗号分隔:
with=
- 在模型上运行自定义作用域:
scopename=
- 仅某些ID(分页将不起作用):
only=
- 按列和方向排序:
orderBy=id|asc,name|desc,email
示例
/api/users?query=John&exclude=4&limit=10&with=department,team&departments=1,3&orderBy=name