gravure/laravel-json-api

原生集成 Json API 规范。

1.5 2018-10-08 07:04 UTC

This package is auto-updated.

Last update: 2024-09-08 20:37:11 UTC


README

codecov

此包有助于生成与 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();
    }
}