Graphql解析器将Lighthouse Graphql与Laravel配合使用时出现问题

hl0ma9xz  于 2022-11-26  发布在  其他
关注(0)|答案(2)|浏览(208)

:)
我正在使用Lighthouse启动一个新的Laravel项目,并且在解决非根字段时遇到了问题。
根据这里的文档,对于每个具有复杂类型的字段,都应该为该字段提供一个模型和一个查询。
在这个例子中,我有一个Version对象,它有两个子字段:appVersionapiVersion。下面是我的schema.graphql文件中的内容:

type Query {
    version: Version
}

type Version {
    appVersion: String
    apiVersion: String
}

另外,这是我的Version模型:

<?php

namespace App\Models;

class Version {

    private string $appVersion;

    private string $apiVersion;

    public function __construct() {
        $composer = file_get_contents('../composer.json');
        $content = json_decode($composer, true);

        $this->appVersion = $content['app-version'];
        $this->apiVersion = $content['version'];
    }

    public function getAppVersion() : string {
        return $this->appVersion;
    }

    public function getApiVersion() : string {
        return $this->apiVersion;
    }

    function export() : array {
        return [
            'app' => $this->getAppVersion(),
            'api' => $this->getApiVersion(),
        ];
    }
}

Version的查询文件:

<?php

namespace App\GraphQL\Queries;

use GraphQL\Type\Definition\ResolveInfo;
use Nuwave\Lighthouse\Support\Contracts\GraphQLContext;

final class Version {

    public function __invoke ($version, array $args, GraphQLContext $context, ResolveInfo $resolveInfo) {
        return $version->export()[$resolveInfo->fieldName];
    }
}

然而,当我尝试使用以下语句查询版本时,$version似乎总是空的:

{
  version {
    appVersion
  }
}

我不知道为什么。我试着尽我所能地跟踪文档,但我可能在这里错过了一些非常简单的东西:/我还应该提到,查询简单字段(如没有子选择的字段)在这里对我很有效。任何帮助都将不胜感激:)
我实现了一个graphql解析器,但是模型没有正确解析。

zbdgwd5y

zbdgwd5y1#

App\GraphQL\Queries\Version::__invoke方法是一个字段解析器。该解析器的第一个参数是根值。可以将其视为树中该查询上面的查询的“父”值。在您的示例中,您从根“Query”类型查询版本,因此上面的树中没有值。这就是它为空的原因。
您的模式定义显示“There is a model with properties appVersion and apiVersion”(存在一个具有appVersion和apiVersion属性的模型)。因此,您的版本查询应该返回一个具有appVersion和apiVersion属性的数组或类。它不需要是一个有说服力的模型。

<?php

namespace App\GraphQL\Queries;

use GraphQL\Type\Definition\ResolveInfo;
use Nuwave\Lighthouse\Support\Contracts\GraphQLContext;

final class Version {

    public function __invoke ($version, array $args, GraphQLContext $context, ResolveInfo $resolveInfo) {
        $composer = file_get_contents('../composer.json');
        $content = json_decode($composer, true);

        return [
            'appVersion' => $content['app-version'],
            'apiVersion' => $content['version'],
        ];
    }
}
8fsztsew

8fsztsew2#

将@字段指令添加到架构中:

type Query {
    version: Version @field(resolver: "App\GraphQL\Queries\Version")
}

相关问题