nvmcommunity / laravel-eloquent-api
使用 Alchemist Restful API,轻松从 API 请求构建 Eloquent 查询。
0.0.4
2024-04-18 12:23 UTC
Requires
- php: ^8.1
- illuminate/database: ^10.0|^11.0
- nvmcommunity/alchemist-restful-api: ^2.0
This package is auto-updated.
Last update: 2024-09-19 05:33:39 UTC
README
使用 Alchemist Restful API,轻松从 API 请求构建 Eloquent 查询。
描述
这是一个帮助您将 Alchemist Restful API 与 Laravel Eloquent 集成的包。有关 Alchemist Restful API 的概念和使用方法,请参阅Alchemist Restful API 文档
安装
composer require nvmcommunity/laravel-eloquent-api
基本用法
步骤 1: 定义 API 类
use Nvmcommunity\Alchemist\RestfulApi\Common\Exceptions\AlchemistRestfulApiException; use Nvmcommunity\Alchemist\RestfulApi\Common\Integrations\AlchemistQueryable; use Nvmcommunity\Alchemist\RestfulApi\FieldSelector\Handlers\FieldSelector; use Nvmcommunity\Alchemist\RestfulApi\ResourceFilter\Handlers\ResourceFilter; use Nvmcommunity\Alchemist\RestfulApi\ResourceFilter\Objects\FilteringRules; use Nvmcommunity\Alchemist\RestfulApi\ResourcePaginations\OffsetPaginator\Handlers\ResourceOffsetPaginator; use Nvmcommunity\Alchemist\RestfulApi\ResourceSearch\Handlers\ResourceSearch; use Nvmcommunity\Alchemist\RestfulApi\ResourceSort\Handlers\ResourceSort; class UserApiQuery extends AlchemistQueryable { /** * @param FieldSelector $fieldSelector * @return void */ public static function fieldSelector(FieldSelector $fieldSelector): void { $fieldSelector->defineFieldStructure([ 'id', 'name', 'email', 'created_at' ]) ->defineDefaultFields(['id']); } /** * @param ResourceFilter $resourceFilter * @return void */ public static function resourceFilter(ResourceFilter $resourceFilter): void { $resourceFilter->defineFilteringRules([ FilteringRules::String('id', ['eq']), FilteringRules::String('name', ['eq', 'contains']), FilteringRules::String('email', ['eq', 'contains']), FilteringRules::Datetime('created_at', ['eq', 'gte', 'lte', 'between']), ]); } /** * @param ResourceOffsetPaginator $resourceOffsetPaginator * @return void */ public static function resourceOffsetPaginator(ResourceOffsetPaginator $resourceOffsetPaginator): void { $resourceOffsetPaginator->defineDefaultLimit(10) ->defineMaxLimit(1000); } /** * @param ResourceSearch $resourceSearch * @return void */ public static function resourceSearch(ResourceSearch $resourceSearch): void { $resourceSearch->defineSearchCondition('name'); } /** * @param ResourceSort $resourceSort * @return void * @throws AlchemistRestfulApiException */ public static function resourceSort(ResourceSort $resourceSort): void { $resourceSort->defineDefaultSort('id') ->defineDefaultDirection('desc') ->defineSortableFields(['id', 'name']); } }
步骤 2: 验证并响应请求
在执行查询和响应请求之前,请确保使用 $eloquentBuilder->validate()
方法验证从请求输入传递的输入参数。
use App\Models\User; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Nvmcommunity\Alchemist\RestfulApi\Common\Exceptions\AlchemistRestfulApiException; use Nvmcommunity\EloquentApi\EloquentBuilder; class UserController extends Controller { /** * @param Request $request * @param JsonResponse $response * @return JsonResponse * @throws AlchemistRestfulApiException */ public function index(Request $request, JsonResponse $response): JsonResponse { $eloquentBuilder = EloquentBuilder::for(User::class, UserApiQuery::class, $request->input()); // Validate the input parameters if (! $eloquentBuilder->validate($e)->passes()) { return $response->setData($e->getErrors())->setStatusCode(400); } // It's safe to execute the query now. // Return the result as JSON return $response->setData($eloquentBuilder->getBuilder()->get()); } }
贡献者
代码贡献者
本项目的存在离不开所有贡献者。
许可证
本项目采用 MIT 许可协议