指南
序言
了解 Orion for Laravel 2.0 中的变更与新特性。
发布说明
OpenAPI 规范生成
现在,你只需运行以下命令,即可为所有由 Orion 驱动的端点自动生成 OpenAPI 规范:
php artisan orion:specs
你可以在本指南的规范一节了解该特性的更多信息。
JSON 字段搜索
2.0 版本引入了对 JSON 字段的支持,带来更强大的搜索能力。
// (POST) https://myapp.com/api/posts/search
{
"filters" : [
{"field" : "options->visible", "operator" : ">=", "value" : true},
],
"search" : {
"value" : "Example post"
},
"sort" : [
{"field" : "options->key", "direction" : "asc"},
]
}
要将 JSON 字段内部的字段加入白名单,请使用箭头写法:
<?php
namespace App\Http\Controllers\Api;
use Orion\Http\Controllers\Controller;
// 这里的 options 字段是 Post 模型的 json/jsonb 字段
// visible 和 key 字段是该 json/jsonb 字段内部的字段
class PostsController extends Controller
{
public function filterableBy() : array
{
return ['options->visible'];
}
public function searchableBy() : array
{
return [ 'options->key'];
}
public function sortableBy() : array
{
return ['options->key'];
}
}
嵌套关联搜索
在此之前,只能在一层深度的关联字段上进行搜索,例如:
public function searchableBy() : array
{
return ['user.name']; // user 关联的 name 字段
}
本次发布支持在深层嵌套的关联上执行搜索:
public function searchableBy() : array
{
return ['user.name', 'user.location.address.postalcode']; // 深层嵌套的 user.location.address 关联的 postalcode 字段
}
钩子方法签名
现在,父实体会被传入关联控制器的钩子方法,例如:
protected function afterSave(Request $request, Model $parentEntity, Model $entity)
默认认证守卫解析
默认认证守卫现在从 orion.php 配置文件的 auth.guard 键解析。
如果你需要对认证守卫或用户解析进行更细粒度的控制,仍然可以在控制器上重写 resolveUser 方法。
支持 ilike 与 not ilike 操作符
// (POST) https://myapp.com/api/posts/search
{
"filters" : [
{"field" : "title", "operator" : "ilike", "value" : "example post"},
]
}
升级指南
本指南介绍将 Laravel Orion 从 v1.x 升级到 v2.x 的过程。
要求 PHP 7.3
最低 PHP 版本现在为 7.3.0。
更新依赖
在 composer.json 文件中更新以下依赖:
php更新为>=7.3tailflow/laravel-orion更新为^2.0
发布配置
本次发布引入了 orion.php 配置文件,允许你自定义默认认证驱动,以及用于规范生成的 API 信息。
要发布配置,请运行以下命令:
php artisan vendor:publish --tag=orion-config
白名单方法签名
以下方法已改为 public:
exposedScopesfilterableBysearchableBysortableByincludesalwaysIncludes
如果你重写过其中任何方法,请相应地更新你的控制器。
钩子方法签名
从 2.0 版本开始,父实体会被传入钩子方法。如果你重写过任何钩子方法,请相应地更新你的关联控制器。
示例如下:
2.0 之前
protected function afterSave(Request $request, Model $entity)
2.0 之后
protected function afterSave(Request $request, Model $parentEntity, Model $entity)