camilord / laravel-api-controller
一个基于laravel的API基础控制器,具有映射到模型的基本CRUD操作。源自https://github.com/phpsa/laravel-api-controller
Requires
- php: >=8.0|>=8.1|>=8.2|>=8.3
- laravel/framework: >=8.0|>=9.0|>=10.0
Requires (Dev)
- orchestra/testbench: >=8.0|>=9.0
- phpunit/phpunit: >=9.0
README
此存储库是我维护的一个工作项目的必需品,遗憾的是,维护者在2.0.0版本之后删除了hasRepository
和BaseRepository
。
Laravel API 控制器
默认情况下,可以扩展模型的基本CRUD API方法,包括列表、显示、更新、添加和删除端点,以便与模型进行交互。
安装
通过composer安装
composer require phpsa/laravel-api-controller
发布配置文件(可选 - 如果您需要更改任何默认配置)
php artisan vendor:publish --provider="Phpsa\LaravelApiController\ServiceProvider" --tag="config"
使用方法
通过php artisan make:api {ModelName}
生成新的API控制器、存储库和路由
这将为您创建一个Api/ModelNameController,并为您设置以下基本路由
- GET
api/v1/{model_name}
- 列出所有/分页/过滤(class::index) - GET
api/v1/{model_name}/$id
- 显示指定id(class::show) - POST
api/v1/{model_name}
- 插入新记录(class::store) - PUT
api/v1/{model_name}/$id
- 更新现有记录(class::update) - DELETE
api/v1/{model_name}/$id
- 删除现有记录(class::destroy)
您可以通过简单地添加自己的方法来覆盖这些方法,方法名在上面的括号中
事件
- POST(class::store)- 触发新的
Phpsa\LaravelApiController\Events\Created
事件,其中新记录作为$record
可用 - PUT(class::update)- 触发新的
Phpsa\LaravelApiController\Events\Updated
事件,其中更新后的记录作为$record
可用 - DELETE(class::destroy)- 触发新的
Phpsa\LaravelApiController\Events\Deleted
事件,其中被删除的记录作为$record
可用
策略
策略: https://laravel.net.cn/docs/6.x/authorization#generating-policies
使用php artisan make:policy PostPolicy --model=Post
生成
- 获取列表 - 调用
viewAny
策略 - 获取单个 - 调用
view
策略 - 新建 - 调用
create
策略 - 更新 - 调用
update
策略 - 删除项 - 调用
delete
策略
策略中的查询/数据修改器用于API端点
qualifyCollectionQueryWithUser($user, $repository)
-> 返回 void - 向存储库添加任何查询(例如 ->where('x','))qualifyItemQueryWithUser($user, $repository)
-> 返回 void - 向存储库添加任何查询(例如 ->where('x','))qualifyStoreDataWithUser($data)
- 返回更新的数据数组qualifyUpdateDataWithUser($data)
- 返回更新的数据数组
资源/集合(转换)
资源: https://laravel.net.cn/docs/6.x/eloquent-resources
使用php artisan make:apiresource UserResource
和php artisan make:resource UserCollection
生成
将资源扩展为
使用Phpsa\LaravelApiController\Http\Resources\ApiResource
作为您的资源,使用Phpsa\LaravelApiController\Http\Resources\ApiCollection
作为您的资源集合
在您的控制器中覆盖以下参数
protected $resourceSingle = UserResource::class; protected $resourceCollection = UserCollection::class;
蛇形与驼峰
- 将所有驼峰转换为蛇形的中间件:
Phpsa\LaravelApiController\Http\Middleware\SnakeCaseInputs
- 将请求头
X-Accept-Case-Type
设置为snake
或camel
,以更改您的数据响应
过滤
对于get命令,您可以使用以下URL模式进行过滤
在/不在
您可以将值数组传递给过滤器,例如:filter[user_id]=1||2||||4||7
或filter[user_id!]=55||33
空/非空(从1.23.0版引入)
如果您需要过滤字段是否为空或非空,从1.23.0版开始可以使用过滤器参数。例如:filter[age]=NULL
或filter[age!]=NULL
。注意,NULL必须为大写。
旧版本给您的模型添加一个范围:例如
public function scopeAgeNull(Builder $builder, $isNull = true){ $isNull ? $builder->whereNull('age') : $builder->whereNotNull('age'); }
将其添加到您的allowedScopes中,然后可以在URL中作为?ageNull=1
(表示为空)和?ageNull=0
(表示非空)进行调用
作用域
除了过滤外,您还可以使用Laravel的Eloquent 查询作用域进行更复杂的搜索或过滤。只需将$allowedScopes
添加到您的ApiResource
中,该作用域将作为查询参数公开。
假设您在Eloquent模型上定义了一个scopeFullname
,您可以将此作用域公开给API如下所示
protected static $allowedScopes = [ 'fullname' ];
给定上述$allowedScopes
数组,您的API消费者现在可以请求?fullname=John
。查询参数值将传递到您的Eloquent模型中的作用域函数。
过滤相关模型
您可以使用任何配置了include
的相关模型轻松进行过滤。只需在查询字符串中指定?filter[model.field]=123
即可。上述相同的过滤器选项适用于相关字段。
字段、关系、排序和分页
字段
默认情况下返回所有字段,您可以通过以下方式将其限制为特定字段
- API控制器参数
$defaultFields
默认为protected $defaultFields = ['*'];
- 切换到包含字段数组 - URL查询字符串中的fields参数:例如
fields=id,name,age
= 将只返回这些字段,这也会覆盖上述设置。 - 在您的响应资源中,您可以设置static::allowedFields以锁定可返回的字段
- URL查询字符串中的
addfields
和removefields
参数将与这些一起工作。 - 使用Laravel eloquent模型
$appends
属性来自动包含自定义属性访问器。
关系
- 使用在您的模型中定义的关系,您可以传递一个逗号分隔的列表,例如
include=join1,join2
,这将返回这些连接(一个或多个)。
只需将protected static $mapResources
添加到您的Resource
中,以定义要分配相关数据的关系资源。例如,对于一对一关系,应指定一个集合,对于一对多关系,直接指定相关资源。这将允许API正确格式化相关记录。
protected static $mapResources = [
'notes' => NotesCollection::class,
'owner' => OwnerResource::class
];
- 您可以为大多数类型的关系自动更新和创建相关记录。只需在POST或PUT请求中包含相关资源名称即可。
对于BelongsToMany
或MorphToMany
关系,您可以选择同步策略。默认情况下,这将采用添加策略。也就是说,发送的关联记录将被添加到任何现有的关联记录中。在每次请求的基础上,您可以选择同步策略,这将删除请求中未列出的任何关联记录的枢轴。注意,实际的相关记录将不会被删除,只是枢轴条目。
要选择同步行为,请设置请求中的?sync[field]=true
。
排序
- 排序也可以通过逗号分隔的列表传递,例如
sort=age asc
或sort=age asc,name desc,eyes
—— 分别生成 SQLsort age asc
和sort age asc, name desc, eyes asc
。 - 默认排序也可以在控制器中添加,通过覆盖
protected $defaultSort = null;
参数。
分页
- 可以在控制器中通过覆盖
protected $defaultLimit = 25;
来启用/禁用分页。 - 分页也可以通过 URL 传递,使用
limit=xx&page=y
。 - 分页还可以通过覆盖
protected $maximumLimit = false;
参数来限制每页的最大记录数。
验证
- 在提交新记录时,可以通过添加一个返回数组的
rulesForCreate
方法到控制器中来执行验证。
[ 'email' => 'required|email', 'games' => 'required|numeric', ]
请参阅 https://laravel.net.cn/docs/5.8/validation#conditionally-adding-rules
- 更新记录时,按照上述方式添加一个
rulesForUpdate
方法。
默认值
以下参数在 Base Api 控制器中设置,可以根据情况在您的控制器中覆盖
-
已弃用
protected $resourceKeySingular = 'data';
-
已弃用
protected $resourceKeyPlural = 'data';
-
protected $resourceSingle = JsonResource::class;
用于您的单资源集合 -
protected $resourceCollection = ResourceCollection::class;
用于您的资源集合集合 -
protected $defaultFields = ['*'];
默认响应字段 -
protected $defaultSort = null;
设置查询的默认排序 -
protected $defaultLimit = 25;
未指定时一次显示的项目数。(0 = maximumLimit) -
protected $maximumLimit = 0;
可以通过 $_GET['limit'] 设置的最大限制 —— 这与 defaultLimit 有关,如果想要禁用分页,两者都应为 0。)将允许在单个调用中返回所有记录。 -
protected $unguard = false;
在创建/更新之前是否需要取消模型保护?
作用域
软删除记录
将 Phpsa\LaravelApiController\Model\Scopes\WithSoftDeletes
特性添加到您的模型中,添加到资源文件中
class MyModelResource extends ApiResource { protected static $allowedScopes = [ 'withTrashed', 'onlyTrashed' ];
现在可以为查询附加 withTrashed=1
或 onlyTrashed=1
。
响应
可以通过覆盖以下受保护的方来覆盖每个点的响应
- handleIndexResponse
- handleStoreResponse
- handleShowResponse
- handleUpdateResponse
- handleDestroyResponse
安全
如果您发现任何与安全相关的问题,请通过电子邮件而不是使用问题跟踪器。