gravure / laravel-json-api
原生集成 Json API 规范。
1.5
2018-10-08 07:04 UTC
Requires
- php: >=7.1.0
- illuminate/database: ~5.4
- illuminate/routing: ~5.4
- spatie/laravel-json-api-paginate: 1.*
- tobscure/json-api: ^0.3.0
Requires (Dev)
- orchestra/database: ^v3.4.0-BETA1
- orchestra/testbench: ^3.4
- phpunit/phpunit: ^6.0
README
此包有助于生成与 JSON API v1 兼容的输出。
安装
composer require gravure/laravel-json-api
在 config/app.php
中的 providers
下注册服务提供者
Gravure\Api\Providers\ApiProvider::class,
用法
此包的一个重要元素是 ReplacesRequest
中间件,它对于接受 application/vnd.api+json
内容的任何请求都是自动激活的。注入的请求对象提供了一组辅助子类,例如用于处理分页或过滤。
除此之外,通过扩展抽象的 ResourceController 或 Controller,可以轻松地根据规范生成 Json 文档。实际上,ResourceController 提供了一个完整的 Laravel ResourceController 实现,其中它只需要一个仓库来处理数据库特定的逻辑。
示例
这是一个简单的示例,其中包含一个 Post
,它有一个或多个 Comment
以及单个作者 User
。
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { public function comments() { return $this->hasMany(Comment::class); } public function author() { return $this->belongsTo(User::class); } }
<?php namespace App\Serializers; use Gravure\Api\Resources\Collection; use Tobscure\JsonApi\AbstractSerializer; use Tobscure\JsonApi\Relationship; use Tobscure\JsonApi\Resource; class PostSerializer extends AbstractSerializer { protected $type = 'posts'; public function getId($model) { return $model->id; } public function getAttributes($model, array $fields = null) { return [ 'title' => $model->title, 'content' => $model->content, ]; } public function comments($model) { return new Relationship(new Collection($model->comments, new CommentSerializer)); } public function author($model) { return new Relationship(new Resource($model->user, new UserSerializer)); } }
<?php namespace App\Repositories; use App\Post; use Gravure\Api\Contracts\Repository; use Gravure\Api\Http\Request; use Illuminate\Database\Eloquent\Model; class PostRepository implements Repository { public function query() { return Post::query(); } public function find(int $id): ?Model { return Post::find($id); } public function update(Model $model, Request $request): ?Model { $model->title = $request->get('title'); $model->content = $request->get('content'); $model->save(); return $model; } public function store(Request $request): ?Model { $model = new Post; $model->title = $request->get('title'); $model->content = $request->get('content'); $model->save(); return $model; } public function delete(int $id): bool { $model = $this->find($id); if ($model) { return $model->delete(); } return false; } }
<?php namespace App\Http\Controllers; use App\Repositories\PostRepository; use App\Serializers\PostSerializer; use Gravure\Api\Contracts\Repository; use Gravure\Api\Controllers\ResourceController; use Gravure\Api\Http\Request; class PostController extends ResourceController { public function __construct(Request $request) { $this->request = $request; $this->serializer = new PostSerializer(); } protected function repository(): Repository { return new PostRepository(); } }