灯塔 – 在 Laravel 框架中实现类似于 get 的功能的 GraphQL 服务器

GraphQL的简洁性对于前端来说非常吸引人。
因此,为了在开发React应用程序时更加顺利,我尝试在已有的RESTful API旁边进行了试验性的实现。
即使在运行PHP的Apache服务器上,由于有一个强大的GraphQL框架Lighthouse,我也能够很轻松地启动它。

然而,要使现有数据库与其相配合需要进行相当多的配置,并且并不是一帆风顺,因此我将设置的地方整理在一起,重点是解决问题的部分。

试行环境

ソフトウェアバージョンMacOS10.10.5PHP7.2.5Laravel7.0 1Lighthouse4.10 2

服务器的启动是从Laravel或Lighthouse的安装设置已完成的状态开始的。同时假设数据库的连接设置已完成。

准备

创建项目,并安装所需的各种工具,如Lighthouse。

$ composer create-project --prefer-dist laravel/laravel graphql
$ cd graphql
$ composer require nuwave/lighthouse
$ php artisan vendor:publish --provider="Nuwave\Lighthouse\LighthouseServiceProvider" --tag=schema
$ composer require mll-lab/laravel-graphql-playground
$ php artisan serve

本地服务器启动后,您可以通过浏览器访问localhost:8000来查看开发中的页面。此外,您还可以在//localhost:8000/graphql-playground中执行和确认查询等操作。

Schema的定义

这里是定义通过Web应用等进行查询时的格式。
在这里我们会定义项目名称、数据类型等。
尝试进行定义工作时,感觉和考虑RESTful端点时有相似的感觉。

scalar Date @scalar(class: "Nuwave\\Lighthouse\\Schema\\Types\\Scalars\\Date")

type Query {
    book(isbn: Int! @eq(key: CODE)): Book @find
}

type Book {
   isbn: Int
   title: String
   unit_price: Int
   released_on: Date
}

我定义了一个查询图书数据的形式。

在查询中,我们定义了可以查询的数据格式和参数。在这里,我们通过名为book和类型为Book形式的数据以及名为isbn且类型为Int的数据,来定义查询与之匹配的数据。Book的数据格式在另一个地方通过”类型 Book{}”进行了定义。

现在,您应该能够在//localhost:8000/graphql-playground页面上实际进行查询了。

应该可以发送以下类似的查询。

query {
   book(isbn: 4150200858){
      title
      unit_price
      released_on
   }
}

在没有发生错误的情况下,是否返回了空数据?如果返回了空数据,则表示模式定义成功。

查询的实现 (Chinese)

接下来是实际返回数据的实现部分。
在此之前,我将提供一个示例,展示了有实际数据的数据库。

桌子:HDL010

CODENAMTANKAYMD4253903592ブラック・ジャック10656200309204150200858プリンセス・ブライド614198605014488725007銀河英雄伝説1284820171012

希望将列名设为isbn,title,unit_price等,但在某种原因下,它们变成了混合罗马字的名称,而表名也是一个不知道是什么缩写词的示例数据。

首先,我们在Laravel中创建一个模型。

php artisan make:model Models/Book

应该在app/models中创建了一个名为Book.php的文件。
这样就创建了一个继承了Laravel的Eloquent的模型叫做Book。
但是,由于应该引用的数据库表不符合Laravel的命名规则,因此无法获取数据。
因此,将按照以下方式进行自定义。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    protected $table = 'HDL010';
    protected $primaryKey = 'CODE';

    public function getIsbnAttribute(){ return $this->attributes['CODE']; }
    public function getTitleAttribute(){ return $this->attributes['NAM']; }
    public function getUnitPriceAttribute(){ return $this->attributes['TANKA']; }
    public function getReleasedOnAttribute(){ return date('Y-m-d', strtotime($this->attributes['YMD']); }
}

这样一来,原本只返回空数据的查询应该能够返回带有数据了。

最后

Laravel的Eloquent和使用它的Lighthouse是非常容易实现GraphQL的工具,但是如果现有数据库不符合命名规范或者数据库的规范化不足,就不能顺利进行。
根据数据类型,有时候关联关系也无法正常进行,导致数据无法正确获取。
不过,Laravel提供了对异常的定制化,只要进行正确的设置,Lighthouse就能够很好地处理,所以我们能够很轻松地搭建起GraphQL服务器。

不过,这个所谓的“正确设置”在网上查找了一下,却很难找到,给人一种稍微有点技巧的感觉。

Laravel 是面向网络工匠的 PHP 框架。
Lighthouse 是 Laravel 的 GraphQL 服务器。
广告
将在 10 秒后关闭
bannerAds