资讯专栏INFORMATION COLUMN

在 Laravel 应用中构建 GraphQL API

X_AirDu / 999人阅读

摘要:代码示例产品列表和用户列表的例子昨天我们学习了在中搭建环境,现在我们来学习的。可以提升调用的灵活性,我们可以像写数据库查询语句一样来请求来获取所需要的数据,这对构建复杂的查询来说非常有用。

代码示例:产品列表和用户列表的 API 例子

昨天我们学习了 在 Visual Code 中搭建 Laravel 环境,现在我们来学习 Facebook 的 GraphQL 。

GraphQL 是一种 API 查询语言,还是一种根据你为数据定义的类型系统执行查询的服务器端运行时。GraphQL 不依赖于任何指定的数据库或存储引擎,而是由你的代码和数据来作支持的。 graphql.org

GraphQL 可以提升 API 调用的灵活性,我们可以像写数据库查询语句一样来请求 API 来获取所需要的数据,这对构建复杂的 API 查询来说非常有用。GraphQL 还提供了可视化界面来帮助我们编写查询语句,还提供了自动补全的功能,这让编写查询更加简单。

https://github.com/graphql/gr...

从以下图片可以看出,GraphQL 和 Rest 一样都是运行在业务逻辑层以外的:

开始 1. 安装 Laravel

使用下面命令安装最新版本的 Laravel :

# 在命令行中执行
composer global require "laravel/installer"
laravel new laravel-graphql
2. 添加 GraphQL 的包

使用 composer 安装 graphql-laravel,这个包提供了非常多的功能用于整合 Laravel 和 GraphQL 。

3. 创建模型

像下面这样创建模型和表 user_profilesproductsproduct_images,别忘了还要创建模型间的关系。

4. 创建查询和定义 GraphQL 的类型

GraphQL 中的查询与 Restful API 中的末端路径查询是一样的,查询只是用于获取数据,以及创建、更新、删除操作。我们把它称作 Mutation

GraphQL 中的 类型 用于定义查询中每个字段的类型定义,类型会帮助我们格式化查询结果中的有格式的字段,例如布尔类型,字符串类型,浮点类型,整数类型等等,以及我们的自定义类型。下面是查询和类型的目录结构:

这是 UsersQuery.php 和 UsersType.php 文件完整的源代码:

 "Users Query",
        "description" => "A query of users"
    ];
    public function type()
    {
        // 带分页效果的查询结果
        return GraphQL::paginate("users");
    }
    
    // 过滤查询的参数
    public function args()
    {
        return [
            "id" => [
                "name" => "id",
                "type" => Type::int()
            ],
            "email" => [
                "name" => "email",
                "type" => Type::string()
            ]
        ];
    }
    public function resolve($root, $args, SelectFields $fields)
    {
        $where = function ($query) use ($args) {
            if (isset($args["id"])) {
                $query->where("id",$args["id"]);
            }
            if (isset($args["email"])) {
                $query->where("email",$args["email"]);
            }
        };
        $user = User::with(array_keys($fields->getRelations()))
            ->where($where)
            ->select($fields->getSelect())
            ->paginate();
        return $user;
    }
}
 "Users",
        "description" => "A type",
        "model" => User::class, // 定义用户类型的数据模型
    ];
    
    // 定义字段的类型
    public function fields()
    {
        return [
            "id" => [
                "type" => Type::nonNull(Type::int()),
                "description" => "The id of the user"
            ],
            "email" => [
                "type" => Type::string(),
                "description" => "The email of user"
            ],
            "name" => [
                "type" => Type::string(),
                "description" => "The name of the user"
            ],
            // 数据模型 user_profiles 中的关联字段
            "user_profiles" => [
                "type" => GraphQL::type("user_profiles"),
                "description" => "The profile of the user"
            ]
        ];
    }
    protected function resolveEmailField($root, $args)
    {
        return strtolower($root->email);
    }
}

在编写完查询语句和类型之后,我们需要编辑 config/graphql.php 文件,将查询语句和类型注册到 Schema 中。

 "graphql",
    "routes" => "query/{graphql_schema?}",
    "controllers" => RebingGraphQLGraphQLController::class . "@query",
    "middleware" => [],
    "default_schema" => "default",
    // 注册查询命令 
    "schemas" => [
        "default" => [
            "query" => [
                "users" => UsersQuery::class,
                "products" => ProductsQuery::class,
            ],
            "mutation" => [
            ],
            "middleware" => []
        ],
    ],
    // 注册类型
    "types" => [
        "product_images" => ProductImagesType::class,
        "products"  => ProductsType::class,
        "user_profiles"  => UserProfilesType::class,
        "users"  => UsersType::class,
    ],
    "error_formatter" => ["RebingGraphQLGraphQL", "formatError"],
    "params_key"    => "params"
];
5. Testing

我们可以使用 GraphiQL 来十分简单地编写查询语句,因为在编写的时候它可以自动补全,或者我们也可以使用 postman 来请求 API,下面是自动补全的示例:

下面是查询结果的示例

如果你想查阅源代码,可以访问以下地址 :)。

https://github.com/ardani/lar...
转自 PHP / Laravel 开发者社区 https://laravel-china.org/top...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29969.html

相关文章

  • 2017 年崛起的 JS 项目

    摘要:通过对比各项目过去个月在上新增数量,来评估其在年度的受关注程度,进而选出年度领域崛起的明星项目。也许正因为上述最后一点,在中国拥有大量的拥趸。不仅被中国最大的电商平台阿里巴巴使用,也获得了与这些公司青睐。 共 4741 字,读完需 8 分钟,速读 2 分钟。我有幸参与了该项目的部分中文版翻译、校对工作,感谢 Sacha Grief,Micheal Ramberu 的统计整理,以及 Fr...

    gaara 评论0 收藏0
  • PHP / Laravel API 开发推荐阅读清单

    showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社区优秀文章 Laravel 5.5+passport 放弃 dingo 开发 API 实战,让 API 开发更省心 - 自造车轮。 API 文档神器 Swagger 介绍及在 PHP 项目中使用 - API 文档撰写方案 推荐 Laravel API 项目必须使用的 8 个...

    shmily 评论0 收藏0
  • 2019 - Web开发技术指南和趋势

    摘要:以下内容来自我特别喜欢的一个频道这是一个年你成为前端,后端或全栈开发者的进阶指南你不需要学习所有的技术成为一个开发者这个指南只是通过简单分类列出了技术选项我将从我的经验和参考中给出建议首选我们会介绍通用的知识最后介绍年的的一些趋势基础前端开 以下内容来自我特别喜欢的一个Youtube频道: Traversy Media 这是一个2019年你成为前端,后端或全栈开发者的进阶指南: 你...

    sourcenode 评论0 收藏0
  • koa2 + graphql + typescript + jwt + typeorm的nodejs

    最近写了一个node项目,主要使用到的技术有: koa2 // nodejs 框架 koa-router // koa路由 graphql // 查询api typescript // 强类型语言 jwt // 授权 typeorm // typescript的一个orm mysql2 // 内容数据库 mongodb // 日志存储数据库 redis // 服务器缓存 项目结构:sh...

    Dogee 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<