laravel当中使用graphql

graphql 是facebook主推 一种用于API的查询语言

相比起restful api  不用在请求数据类型 量变化的同时提供多个restful api

当然  graphql的基础还是基于restful

这里主要谈谈laravel后端如何提供graphql支撑

引入扩展包

composer require folklore/graphql

如果laravel >=5.5.x

php artisan vendor:publish --provider="Folklore\GraphQL\ServiceProvider"

这样就向你的laravel config目录下发布了配置文件 graphql.php

2018-04-08 16-49-03屏幕截图.png

这个位置可以填入中间件,方便在请求的过程中做一些操作

2018-04-08 16-50-09屏幕截图.png

最重要的schemas 

这个地方定义了query 和 mutation

告诉了查询的入口  一个什么样的query 应该去向什么样的modelQuery

一般query 用于查询资源  mutation用于更新或者创建资源

下面是一个articleQuery

<?php

namespace App\GraphQL\Query;

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

class ArticlesQuery extends Query
{
    protected $attributes = [
        'name' => 'articles',
    ];

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

    public function args()
    {
        return [
            'id'          => ['name' => 'id', 'type' => Type::int()],
            'user_id'     => ['name' => 'user_id', 'type' => Type::int()],
            'category_id' => ['name' => 'category_id', 'type' => Type::int()],
            'limit'       => ['name' => 'limit', 'type' => Type::int()],
            'offset'       => ['name' => 'offset', 'type' => Type::int()],
        ];
    }

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

        $qb = Article::orderBy('id', 'desc')->where('status','>',0);

        if (isset($args['offset'])) {
            $qb = $qb->skip($args['offset']);
        }

        $limit = 10;
        if (isset($args['limit'])) {
            $limit = $args['limit'];
        }
        $qb = $qb->take($limit);

        if (isset($args['user_id'])) {
            $qb = $qb->where('user_id', $args['user_id']);
        }

        if (isset($args['category_id'])) {
            $qb = $qb->where('category_id', $args['category_id']);
        }

        return $qb->get();
    }
}

 每次的请求经过resolve函数  都会判断传入的$args是否有制定的参数 如果有会在最终的查询语句前加上相应的条件

我的理解graphql实际上是把ORM又封装了一层.

这样在你的站点根目录后加上graphiql

可以方便调试

日记本

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

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