napp / apicore
项目的API核心
2.0.0
2020-10-29 13:46 UTC
Requires
- php: ^7.2|^8.0
- ext-json: *
- illuminate/container: ^5.8|^6.0|^7.0|^8.0
- illuminate/contracts: ^5.8|^6.0|^7.0|^8.0
- illuminate/database: ^5.8|^6.0|^7.0|^8.0
- illuminate/http: ^5.8|^6.0|^7.0|^8.0
- illuminate/pagination: ^5.8|^6.0|^7.0|^8.0
- illuminate/routing: ^5.8|^6.0|^7.0|^8.0
- illuminate/support: ^5.8|^6.0|^7.0|^8.0
- illuminate/validation: ^5.8|^6.0|^7.0|^8.0
Requires (Dev)
- fakerphp/faker: ^1.10
- friendsofphp/php-cs-fixer: ^2.16
- mockery/mockery: ^1.3
- orchestra/database: ^5.1
- orchestra/testbench: ^5.0|^6.3
- phpunit/phpcov: ^6.0|^7.0|^8.0
- phpunit/phpunit: ^8.0|^9.4
- squizlabs/php_codesniffer: ^3.5
This package is auto-updated.
Last update: 2024-08-29 04:33:38 UTC
README
作为API的基础使用。
特性
- 完整的请求周期
- APU认证保护
- 基于模型API映射转换请求输入
- 验证转换后的数据
- 转换响应输出(支持使用
TransformAware
进行嵌套关系的转换) - 正确地将HTTP响应回退到ApiController
- 使用两个渲染器(开发和生产)进行异常处理
- 标准异常
- ETag中间件用于缓存响应(未修改304)
- 内部路由器用于内部API请求
- API代理用于简化请求处理
使用方法
转换映射
能够隐藏数据库字段,使其不在外部暴露的API中显示。具有自动类型转换功能。
<?php use Illuminate\Database\Eloquent\Model; class Post extends Model { /** * @var array */ public $apiMapping = [ 'id' => ['newName' => 'id', 'dataType' => 'int'], 'image' => ['newName' => 'image', 'dataType' => 'string'], 'title' => ['newName' => 'name', 'dataType' => 'string'], 'description' => ['newName' => 'desc', 'dataType' => 'string'], 'created_at' => ['newName' => 'createdAt', 'dataType' => 'datetime'], 'published' => ['newName' => 'published', 'dataType' => 'boolean'], ]; }
工厂模式
使用工厂模式。
<?php namespace App\Posts\Factory; use App\Posts\Models\Post; use Napp\Core\Api\Validation\ValidateTrait; class PostFactory { use ValidateTrait; /** * @param array $attributes * @param bool $validate * @return Post * @throws \Napp\Core\Api\Exceptions\Exceptions\ValidationException */ public static function create(array $attributes, $validate = true): Post { if (true === $validate) { static::validate($attributes, PostValidationRules::$createRules); } return new Post($attributes); } }
请求
扩展ApiRequest
将自动转换输入并在Laravel规则定义的情况下验证它。
<?php namespace App\Posts\Request; use App\Posts\Factory\PostValidationRules; use App\Posts\Transformer\PostTransformer; use Napp\Core\Api\Requests\ApiRequest; use Napp\Core\Api\Transformers\TransformerInterface; class StorePostRequest extends ApiRequest { /** * @return array */ public function rules(): array { return PostTransformer::$createRules; } /** * @return TransformerInterface */ protected function getTransformer(): TransformerInterface { return app(PostTransformer::class); } }
API控制器
API控制器可以使用请求、工厂创建模型、转换输出,并最终提供正确的响应。
<?php namespace App\Posts\Controllers\Api; use App\Posts\Factory\PostFactory; use App\Posts\Transformer\PostTransformer; use Napp\Core\Api\Controllers\ApiController; class PostController extends ApiController { public function show(int $id, Request $request, PostTransformer $transformer): JsonResponse { $post = $this->postRepository->find($id); if (null === $post) { return $this->responseNotFound(); } return $this->respond($transformer->transformOutput($post)); } public function store(StorePostRequest $request, PostTransformer $transformer): JsonResponse { if (/* some logic */) { return $this->responseUnauthorized(); } $post = PostFactory::create($request->validated(), false); return $this->responseCreated($transformer->transformOutput($post)); } }
内部路由器
使用内部路由器请求API。
<?php use Napp\Core\Api\Controllers\ApiInternalController; class MyController extends ApiInternalController { public function someImportantAction() { // using API get/post/put/delete $data = $this->get('/api/v1/some/route'); $stuff = $this->post('/api/v1/new/stuff', $data); return view('my.view', compact('stuff')); } }