scrnhq / laravel-bakery
一个用于 Laravel 的从 Eloquent 模型动态生成 GraphQL Schema 的工具。
Requires
- php: ^7.2|^8.0
- ext-json: *
- illuminate/support: ^6.0|^7.0|^8.0
- webonyx/graphql-php: ^0.13.0
Requires (Dev)
- fakerphp/faker: ^1.9
- laravel/legacy-factories: ^1.1
- mockery/mockery: ^1.3.2
- nunomaduro/larastan: ^0.7.0
- orchestra/testbench: ^4.0|^5.0|^6.0
- phpunit/phpunit: ^8.0|^9.0
- 3.x-dev
- v3.3.11
- v3.3.10
- v3.3.9
- v3.3.8
- v3.3.7
- v3.3.6
- v3.3.5
- v3.3.4
- v3.3.3
- v3.3.2
- v3.3.1
- v3.3.0
- v3.2.0
- v3.1.0
- v3.0.1
- v3.0.0
- 2.x-dev
- v2.1.10
- v2.1.9
- v2.1.8
- v2.1.7
- v2.1.6
- v2.1.5
- v2.1.4
- v2.1.3
- v2.1.2
- v2.1.1
- v2.1.0
- v2.0.5
- v2.0.4
- v2.0.3
- v2.0.2
- v2.0.1
- v2.0.0
- v2.0.0-beta.2
- v2.0.0-beta.1
- 1.x-dev
- v1.0.9
- v1.0.8
- v1.0.7
- v1.0.6
- v1.0.5
- v1.0.4
- v1.0.3
- v1.0.2
- v1.0.1
- v1.0.0
- dev-master
- dev-feature-mutate-many
- dev-feature/authorize-to-remove
- dev-docs
- dev-feature/nullable-create
- dev-hotfix/no-primary-key
This package is auto-updated.
Last update: 2024-09-14 17:21:33 UTC
README
一个用于 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自动为每个注册的模型创建create、update和delete变异。Bakery还无缝使用Laravel的策略来授权用户的操作。
为您的模型设置策略是Bakery变异正常工作所必需的。有关更多信息,请参阅https://laravel.net.cn/docs/5.7/authorization。
例如,使用上述模型模式,您可以通过简单的GraphQL变异创建一个Post。
mutation { createPost(input: { title: "Hello world!" }) { id } }