laravel中使用graphql获取数据
1. 安装laravel项目,项目名laravel-graphql,laravel版本5.8
% composer create-project --prefer-dist laravel/laravel laravel-graohql "5.8.*"
% cd laravel-graphql
2. 修改数据库配置
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=12345678
3. 创建对应的数据库laravel
4. 安装graphql-laravel package
% composer require rebing/graphql-laravel
添加service provider (laravel5.5+会自动注册)
// 添加到app/config/app.php
Rebing\GraphQL\GraphQLServiceProvider::class,
// 添加alias
'GraphQL' => 'Rebing\GraphQL\Support\Facades\GraphQL',
生成配置文件
% php artisan vendor:publish --provider="Rebing\GraphQL\GraphQLServiceProvider"
5. 创建 GraphQL 的 Query 和 Type
% php artisan make:graphql:type UsersType
% php artisan make:graphql:type JobsType
% php artisan make:graphql:query UsersQuery
% php artisan make:graphql:query JobsQuery
编辑 type文件
app/GraphQL/Types/UserType.php
<?php
declare(strict_types=1);
namespace App\GraphQL\Types;
use App\User;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Facades\GraphQL;
use Rebing\GraphQL\Support\Type as GraphQLType;
class UsersType extends GraphQLType
{
protected $attributes = [
'name' => 'Users',
'description' => '用户',
'model' => User::class
];
public function fields(): array
{
return [
'id' => [
'type' => Type::nonNull(Type::int()),
'description' => '用户id'
],
'name' => [
'type' => Type::string(),
'description' => '用户名'
],
'email' => [
'type' => Type::string(),
'description' => '用户的email'
],
'job' => [
'type' => Type::listOf(GraphQL::type('jobs')),
'description' => '用户的工作字段'
]
];
}
}
app/GraphQL/Types/JobsType.php
<?php
declare(strict_types=1);
namespace App\GraphQL\Types;
use App\Job;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Type as GraphQLType;
class JobsType extends GraphQLType
{
protected $attributes = [
'name' => 'jobs',
'description' => '工作',
'model' => Job::class
];
public function fields(): array
{
return [
'id' => [
'type' => Type::nonNull(Type::int()),
'description' => '工作id'
],
'name' => [
'type' => Type::string(),
'description' => '工作名'
],
'description' => [
'type' => Type::string(),
'description' => '工作职责描述'
]
];
}
}
编辑query文件
app/GraphQL/Queries/UsersQuery.php
<?php
declare(strict_types=1);
namespace App\GraphQL\Queries;
use App\User;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Facades\GraphQL;
use Rebing\GraphQL\Support\Query;
class UsersQuery extends Query
{
protected $attributes = [
'name' => 'Users query',
'description' => 'A query'
];
public function type(): Type
{
return Type::listOf(GraphQL::type('users'));
}
public function args(): array
{
return [
'id' => ['name' => 'id', 'type' => Type::int()],
'email' => ['name' => 'email', 'type' => Type::string()],
'limit' => ['name' => 'limit', 'type' => Type::int()],
];
}
public function resolve($root, $args)
{
$user = new User;
if(isset($args['limit']) ) {
$user = $user->limit($args['limit']);
}
if(isset($args['id']))
{
$user = $user->where('id' , $args['id']);
}
if(isset($args['email']))
{
$user = $user->where('email', $args['email']);
}
return $user->get();
}
}
app/GraphQL/Queries/JobsQuery.php
<?php
declare(strict_types=1);
namespace App\GraphQL\Queries;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Query;
use Rebing\GraphQL\Support\Facades\GraphQL;
class JobsQuery extends Query
{
protected $attributes = [
'name' => 'jobs',
'description' => 'A query'
];
public function type(): Type
{
return Type::listOf(GraphQL::type('jobs'));
}
public function args(): array
{
return [
'id' => ['name' => 'id', 'type' => Type::int()],
'name' => ['name' => 'name', 'type' => Type::string()],
];
}
public function resolve($root, $args)
{
$user = new Job();
if(isset($args['id']))
{
$user = $user->where('id' , $args['id']);
}
if(isset($args['email']))
{
$user = $user->where('name', $args['name']);
}
return $user->get();
}
}
- 添加type到config/graphql.php配置中
'types' => [
'users' => App\GraphQL\Types\UsersType::class,
'jobs' => App\GraphQL\Types\JobsType::class,
],
- 添加query到config/graphql.php配置中
'schemas' => [
'default' => [
'query' => [
'users' => App\GraphQL\Queries\UsersQuery::class,
'jobs' => App\GraphQL\Queries\JobsQuery::class,
],
// ...
]
]
- 填充测试数据
% php artisan make:seeder UsersTableSeeder
% php artisan make:seeder JobsTableSeeder
// database/seeds/UsersTableSeeder.php
...
class UsersTableSeeder extends Seeder
{
public function run()
{
DB::table('users')->insert([
'name' => 'kwen',
'email' => 'email@email.com',
'password' => bcrypt('123456'),
]);
DB::table('users')->insert([
'name' => 'kwen1',
'email' => 'email1@email.com',
'password' => bcrypt('123456'),
]);
}
}
// database/seeds/JobsTableSeeder.php
...
class JobsTableSeeder extends Seeder
{
public function run()
{
DB::table('jobs')->insert([
'user_id' => 1,
'name' => '前端开发工程师',
'description' => '前端前端'
]);
DB::table('jobs')->insert([
'user_id' => 2,
'name' => 'PHP开发工程师',
'description' => 'PHP'
]);
}
}
修改database/seeds/DatabaseSeeder.php文件
// database/seeds/DatabaseSeeder.php
...
class DatabaseSeeder extends Seeder
{
public function run()
{
$this->call(UsersTableSeeder::class);
$this->call(JobsTableSeeder::class);
}
}
用artisan命令进行填充
% php artisan db:seed
安装GraphQL 可视化调试工具
这里使用的是 GraphQL 可视化调试工具,专门针对 Laravel 的 noh4ck/laravel-graphiql
- 安装noh4ck/laravel-graphiql package
% composer require "noh4ck/graphiql:@dev"
- 打开 ==config/app.php== 并添加以下代码到 ==providers== 中
Graphiql\GraphiqlServiceProvider::class
- 发布这个包并生成 config/graphiql.php 配置文件
% php artisan graphiql:publish
- 运行 php artisan serve 然后打开 http://127.0.0.1:8000/graphql-ui 就可以打开测试工具的界面了
网友评论