Laravel API 基于 GraphQL 构建 Laravel API

GraphQl 简介

Graphql 是一个用于api的查询语言,同时也是一个通过为你的数据定义类型系统进行查询的服务端运行时.

Graphql 与数据库或任意存储引擎无关,仅仅是代码逻辑层的查询实现.

通过GraphQl,可以提高Api调用的灵活性,我们可以在访问Api时像编写数据库查询一样通过编写查询语句指定需要的数据,这在构建复杂API的时候很有用,Graphql已经提供了用户接口帮助我们来编写查询,此外,还提供了编写查询时的自动提示的UI工具,GraphiQl,这些接口极大的提升了查询的编写效率.

Graphql 也可以当成是一种接口 来规范风格:

如下图:


15232527107678.jpg

创建Query

GraphQl 基于类型进行操作,所以开始之前需要为User的模型创建一个UserType:

php artisan make:graphql:type UserType

编写UserType类的代码如下:

namespace App\GraphQL\Type;

use GraphQL\Type\Definition\Type;
use Folklore\GraphQL\Support\Type as BaseType;
use GraphQL;

class UserType extends BaseType
{
    protected $attributes = [
        'name' => 'User',
        'description' => 'A User'
    ];

    public function fields()
    {
        return [
            'id' => [
                'type' => Type::nonNull(Type::string()),
                'description' => 'The id of the user'
            ],
            'email' => [
                'type' => Type::string(),
                'description' => 'The email of the user'
            ]
        ];
    }

    protected function resolveEmailField($root, $args)
    {
        return strtolower($root->email);
    }
}

然后在config/graphql.php中注册该类型:

'types' => [
    'User' => \App\GraphQL\Type\UserType::class,
],

定义好UserType 之后,我们来编写查询实现,首先通过以下Artisan命令创建查询类:

php artisan make:graphql:query UserQuery

编写UserQuery类代码如下:

namespace App\GraphQL\Query;

use App\User;
use Folklore\GraphQL\Support\Query;
use GraphQL\Type\Definition\Type;
use GraphQL;

class UserQuery extends Query
{
    protected $attributes = [
        'name' => 'users',
    ];

    public function type()
    {
        return Type::listOf(GraphQL::type('User'));
    }

    public function args()
    {
        return [
            'id' => ['name' => 'id', 'type' => Type::string()],
            'email' => ['name' => 'email', 'type' => Type::string()]
        ];
    }

    public function resolve($root, $args)
    {
        if (isset($args['id'])) {
            return User::where('id', $args['id'])->get();
        } elseif (isset($args['email'])) {
            return User::where('email', $args['email'])->get();
        } else {
            return User::all();
        }
    }
}

然后配置config/graphql.php 新增查询结构:

'schemas' => [
    'default' => [
        'query' => [
            'users' => \App\GraphQL\Query\UserQuery::class,
        ],
        'mutation' => [

        ]
    ]
],

现在我们就可以通过接口访问用户数据了.可以通过Graphiql工具来测试:

15232410942211.jpg

日记本

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

赞赏支持
被以下专题收入,发现更多相似内容