scrnhq/laravel-bakery

一个用于 Laravel 的从 Eloquent 模型动态生成 GraphQL Schema 的工具。

v3.3.11 2021-12-14 11:26 UTC

README

Laravel Bakery logo

Build Status status Latest Version Code Quality Total Downloads License

一个用于 Laravel 的从 Eloquent 模型动态生成 GraphQL Schema 的工具。

安装

此包需要 PHP 7.2 和 Laravel 6 或更高版本。要开始使用 Bakery,只需运行

composer require scrnhq/laravel-bakery

快速入门

安装 Bakery 后,使用 bakery:install Artisan 命令发布配置和断言。

php artisan bakery:install

运行此命令后,配置文件应位于 config/bakery.php。默认的 App\Bakery\User Bakery 模型模式引用了 App\User 模型。

您可以在 /graphql 找到您的新 GraphQL API,您可以通过访问 /graphql/explore 来找到 GraphiQL,这是一个图形交互式 GraphQL IDE。

query {
  users {
    items {
      id
    }
  }
}

模型模式

模型模式是类,允许您将 Eloquent 模型与 GraphQL API 连接起来。在那里,您可以定义哪些字段可用,哪些可以被突变以及更多。

默认情况下,Bakery 模型模式存储在 app\Bakery 目录中。您可以使用便捷的 bakery:modelschema Artisan 命令生成新的模型模式。

php artisan bakery:modelschema Post

模型模式的 model 属性定义了它对应的 Eloquent 模型。

/**
 * The model the schema corresponds to.
 *
 * @var string
 */
protected $model = \App\Post::class;

注册模型模式

app/Bakery 目录中的所有模型模式都将自动由 Bakery 注册。如果您选择以不同的方式存储您的模型模式,您需要手动定义和注册您的模式。

您不需要手动定义和注册模式。如果您不想手动注册模式,可以跳过此步骤。

为了使模型模式在 GraphQL 中可用,它们必须在模式中注册。首先,您必须创建一个新的 Schema 类。然后,您应该在 config/bakery.php 文件中将 schema 项设置为新建的模式。

在 Bakery 中手动注册模型模式有两种方式。您可以使用模式中的 modelsIn 方法加载给定目录中的所有模型模式,或者您可以手动返回一个模型模式的数组。

namespace App\Support;

use Bakery\Support\Schema as BaseSchema;

class Schema extends BaseSchema
{
    /*
     * Get the models for the schema.
     *
     * @return array
     */
    public function models()
    {
        return $this->modelsIn(app_path('Bakery'));
        
        // Or, manually.
        return [
            App\Bakery\User::class,
            App\Bakery\Post::class,
        ];
    }
}

现在,您已经使用 Bakery 创建并注册了您的模型模式,您可以通过访问 /graphql/explore 在交互式 playground GraphQL 中查询您的模型。

query {
  posts {
    items {
      id
    }
  }
}

如果一切设置正确,您将在数据库中获得一系列帖子。您也可以使用 GraphQL 来检索单个帖子。

query {
  posts(id: "1") {
    id
  }
}

与 Laravel 一样,Bakery 遵循命名约定。它使用 Laravel 的复数化库将您的模型转换为查询,因此您可以使用 post 获取单个帖子,使用 posts 获取帖子集合。

字段

现在,每个 Bakery 模型模式都包含一个 fields,它返回一个扩展 \Bakery\Fields\Field 类的数组。要将字段添加到模型模式,只需将其添加到 fields 方法中,其中项的键必须与模型的 attribute 名称匹配。

use Bakery\Field;

/**
 * Get the fields for the schema.
 *
 * @return array
 */
public function fields(): array
{
    return [
        'title' => Field::string(),
    ];
}

现在您可以在 GraphQL 中查询帖子的标题。

query {
  post(id: "1") {
    id
    title
  }
}

字段类型

Bakery 有以下字段可用

布尔型
Field::boolean()
浮点型
Field::float()
ID
Field::ID()
整型
Field::int()
字符串
Field::string()

关系

除了上面描述的字段外,Bakery还支持Eloquent关系。要将关系添加到模型模式中,只需将其添加到relations方法中,其中项目的键必须与关系名称匹配。假设有一个User模型hasManyPost模型。那么您会这样定义Bakery模型模式

app\Bakery\User.php

use Bakery\Field;
use App\Bakery\Post;

/**
 * Get the fields for the schema.
 *
 * @return array
 */
public function relations()
{
    return [
        'posts' => Field::collection(Post::class),
    ];
}

上一个关系的逆关系是,一个Post模型belongsTo一个User模型。Bakery模型模式可以这样定义

app\Bakery\Post.php

use Bakery\Field;
use App\Bakery\User;

/**
 * Get the fields for the schema.
 *
 * @return array
 */
public function relations()
{
    return [
        'user' => Field::model(User::class),
    ];
}

这样,您可以在单个GraphQL查询中获取与用户相关联的所有帖子。

query {
  user(id: "1") {
    id
    posts {
      id
    }
  }
}

变异

GraphQL的另一个关键特性,Bakery完全支持,是变异。Bakery自动为每个注册的模型创建createupdatedelete变异。Bakery还无缝使用Laravel的策略来授权用户的操作。

为您的模型设置策略是Bakery变异正常工作所必需的。有关更多信息,请参阅https://laravel.net.cn/docs/5.7/authorization

例如,使用上述模型模式,您可以通过简单的GraphQL变异创建一个Post

mutation {
  createPost(input: {
    title: "Hello world!"
  }) {
    id
  }
}