bonline/graphql
Composer 安装命令:
composer require bonline/graphql
包简介
Facebook GraphQL for Laravel
关键字:
README 文档
README
Use Facebook GraphQL with Laravel 5 or Lumen. It is based on the PHP implementation here. You can find more information about GraphQL in the GraphQL Introduction on the React blog or you can read the GraphQL specifications. This is a work in progress.
This package is compatible with Eloquent model (or any other data source). See the example below.
To use laravel-graphql with Relay, check the feature/relay branch.
Installation
Version 1.0 is released. If you are upgrading from older version, you can check Upgrade to 1.0.
Dependencies:
1- Require the package via Composer in your composer.json.
composer require aammui/laravel-graphql
2- Run Composer to install or update the new requirement.
composer install
3- Publish the configuration file
$ php artisan vendor:publish --provider="Folklore\GraphQL\ServiceProvider"
4- Review the configuration file
config/graphql.php
Documentation
Usage
Advanced Usage
Schemas
Starting from version 1.0, you can define multiple schemas. Having multiple schemas can be useful if, for example, you want an endpoint that is public and another one that needs authentication.
You can define multiple schemas in the config:
'schema' => 'default', 'schemas' => [ 'default' => [ 'query' => [ //'users' => 'App\GraphQL\Query\UsersQuery' ], 'mutation' => [ //'updateUserEmail' => 'App\GraphQL\Query\UpdateUserEmailMutation' ] ], 'secret' => [ 'query' => [ //'users' => 'App\GraphQL\Query\UsersQuery' ], 'mutation' => [ //'updateUserEmail' => 'App\GraphQL\Query\UpdateUserEmailMutation' ] ] ]
Or you can add schema using the facade:
GraphQL::addSchema('secret', [ 'query' => [ 'users' => 'App\GraphQL\Query\UsersQuery' ], 'mutation' => [ 'updateUserEmail' => 'App\GraphQL\Query\UpdateUserEmailMutation' ] ]);
Afterwards, you can build the schema using the facade:
// Will return the default schema defined by 'schema' in the config $schema = GraphQL::schema(); // Will return the 'secret' schema $schema = GraphQL::schema('secret'); // Will build a new schema $schema = GraphQL::schema([ 'query' => [ //'users' => 'App\GraphQL\Query\UsersQuery' ], 'mutation' => [ //'updateUserEmail' => 'App\GraphQL\Query\UpdateUserEmailMutation' ] ]);
Or you can request the endpoint for a specific schema
// Default schema
http://homestead.app/graphql?query=query+FetchUsers{users{id,email}}
// Secret schema
http://homestead.app/graphql/secret?query=query+FetchUsers{users{id,email}}
Creating a query
First you need to create a type.
namespace App\GraphQL\Type; use GraphQL\Type\Definition\Type; use Folklore\GraphQL\Support\Type as GraphQLType; class UserType extends GraphQLType { protected $attributes = [ 'name' => 'User', 'description' => 'A user' ]; /* * Uncomment following line to make the type input object. * http://graphql.org/learn/schema/#input-types */ // protected $inputObject = true; public function fields() { return [ 'id' => [ 'type' => Type::nonNull(Type::string()), 'description' => 'The id of the user' ], 'email' => [ 'type' => Type::string(), 'description' => 'The email of user' ] ]; } // If you want to resolve the field yourself, you can declare a method // with the following format resolve[FIELD_NAME]Field() protected function resolveEmailField($root, $args) { return strtolower($root->email); } }
Add the type to the config/graphql.php configuration file
'types' => [ 'User' => 'App\GraphQL\Type\UserType' ]
You could also add the type with the GraphQL Facade, in a service provider for example.
GraphQL::addType('App\GraphQL\Type\UserType', 'User');
Then you need to define a query that returns this type (or a list). You can also specify arguments that you can use in the resolve method.
namespace App\GraphQL\Query; use GraphQL; use GraphQL\Type\Definition\Type; use Folklore\GraphQL\Support\Query; use App\User; class UsersQuery 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(); } else if(isset($args['email'])) { return User::where('email', $args['email'])->get(); } else { return User::all(); } } }
Add the query to the config/graphql.php configuration file
'schemas' => [ 'default' => [ 'query' => [ 'users' => 'App\GraphQL\Query\UsersQuery' ], // ... ] ]
And that's it. You should be able to query GraphQL with a request to the url /graphql (or anything you choose in your config). Try a GET request with the following query input
query FetchUsers {
users {
id
email
}
}
For example, if you use homestead:
http://homestead.app/graphql?query=query+FetchUsers{users{id,email}}
Creating a mutation
A mutation is like any other query, it accepts arguments (which will be used to do the mutation) and return an object of a certain type.
For example a mutation to update the password of a user. First you need to define the Mutation.
namespace App\GraphQL\Mutation; use GraphQL; use GraphQL\Type\Definition\Type; use Folklore\GraphQL\Support\Mutation; use App\User; class UpdateUserPasswordMutation extends Mutation { protected $attributes = [ 'name' => 'updateUserPassword' ]; public function type() { return GraphQL::type('User'); } public function args() { return [ 'id' => ['name' => 'id', 'type' => Type::nonNull(Type::string())], 'password' => ['name' => 'password', 'type' => Type::nonNull(Type::string())] ]; } public function resolve($root, $args) { $user = User::find($args['id']); if (!$user) { return null; } $user->password = bcrypt($args['password']); $user->save(); return $user; } }
As you can see in the resolve method, you use the arguments to update your model and return it.
You then add the mutation to the config/graphql.php configuration file
'schema' => [ 'default' => [ 'mutation' => [ 'updateUserPassword' => 'App\GraphQL\Mutation\UpdateUserPasswordMutation' ], // ... ] ]
You should then be able to use the following query on your endpoint to do the mutation.
mutation users {
updateUserPassword(id: "1", password: "newpassword") {
id
email
}
}
if you use homestead:
http://homestead.app/graphql?query=mutation+users{updateUserPassword(id: "1", password: "newpassword"){id,email}}
Adding validation to mutation
It is possible to add validation rules to mutation. It uses the laravel Validator to performs validation against the args.
When creating a mutation, you can add a method to define the validation rules that apply by doing the following:
namespace App\GraphQL\Mutation; use GraphQL; use GraphQL\Type\Definition\Type; use Folklore\GraphQL\Support\Mutation; use App\User; class UpdateUserEmailMutation extends Mutation { protected $attributes = [ 'name' => 'UpdateUserEmail' ]; public function type() { return GraphQL::type('User'); } public function args() { return [ 'id' => ['name' => 'id', 'type' => Type::string()], 'email' => ['name' => 'email', 'type' => Type::string()] ]; } public function rules() { return [ 'id' => ['required'], 'email' => ['required', 'email'] ]; } public function resolve($root, $args) { $user = User::find($args['id']); if (!$user) { return null; } $user->email = $args['email']; $user->save(); return $user; } }
Alternatively you can define rules with each args
class UpdateUserEmailMutation extends Mutation { //... public function args() { return [ 'id' => [ 'name' => 'id', 'type' => Type::string(), 'rules' => ['required'] ], 'email' => [ 'name' => 'email', 'type' => Type::string(), 'rules' => ['required', 'email'] ] ]; } //... }
When you execute a mutation, it will returns the validation errors. Since GraphQL specifications define a certain format for errors, the validation errors messages are added to the error object as a extra validation attribute. To find the validation error, you should check for the error with a message equals to 'validation', then the validation attribute will contain the normal errors messages returned by the Laravel Validator.
{
"data": {
"updateUserEmail": null
},
"errors": [
{
"message": "validation",
"locations": [
{
"line": 1,
"column": 20
}
],
"validation": {
"email": [
"The email is invalid."
]
}
}
]
}
bonline/graphql 适用场景与选型建议
bonline/graphql 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 2.35k 次下载、GitHub Stars 达 0, 最近一次更新时间为 2019 年 05 月 14 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「framework」 「laravel」 「react」 「graphql」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 bonline/graphql 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 bonline/graphql 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 bonline/graphql 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
PHP Framework HLEB2 is the foundation of the web application. Provides ease of development and application performance.
Async Reactive Postgres Driver for PHP (Non-blocking)
Laravel integration for blade-to-react
A simple, flexible Laravel package for adding polymorphic reactions to any model. React with any text: like, love, care, or anything you want.
This library tries to create a simple promise factory standard while waiting for a psr.
Alfabank REST API integration
统计信息
- 总下载量: 2.35k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 10
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2019-05-14