【问题标题】:Graphql Custom type-definition Laravel Lighthouse gives error about missing subClassGraphql 自定义类型定义 Laravel Lighthouse 给出关于缺少子类的错误
【发布时间】:2020-04-15 15:31:02
【问题描述】:

我为自定义电子邮件类型复制了 Lighthouse 网站链接到 (https://webonyx.github.io/graphql-php/type-system/scalar-types/) 的示例。 (见下面的代码)

不幸的是,如果我现在转到 graphql-playground,我会收到 500 错误,说明: "找不到标量电子邮件的 GraphQL\Type\Definition\ScalarType 的匹配子类"

我该如何解决这个错误?

<?php
// file: /graphql/EmailType.php

namespace MyApp;

use GraphQL\Error\Error;
use GraphQL\Error\InvariantViolation;
use GraphQL\Language\AST\StringValueNode;
use GraphQL\Type\Definition\ScalarType;
use GraphQL\Utils\Utils;

class EmailType extends ScalarType
{
    // Note: name can be omitted. In this case it will be inferred from class name 
    // (suffix "Type" will be dropped)
    public $name = 'Email';

    /**
     * Serializes an internal value to include in a response.
     *
     * @param string $value
     * @return string
     */
    public function serialize($value)
    {
        // Assuming internal representation of email is always correct:
        return $value;
    }

    /**
     * Parses an externally provided value (query variable) to use as an input
     *
     * @param mixed $value
     * @return mixed
     */
    public function parseValue($value)
    {
        if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
            throw new Error("Cannot represent following value as email: " . Utils::printSafeJson($value));
        }
        return $value;
    }

    /**
     * Parses an externally provided literal value (hardcoded in GraphQL query) to use as an input.
     * 
     * E.g. 
     * {
     *   user(email: "user@example.com") 
     * }
     *
     * @param \GraphQL\Language\AST\Node $valueNode
     * @param array|null $variables
     * @return string
     * @throws Error
     */
    public function parseLiteral($valueNode, array $variables = null)
    {
        // Note: throwing GraphQL\Error\Error vs \UnexpectedValueException to benefit from GraphQL
        // error location in query:
        if (!$valueNode instanceof StringValueNode) {
            throw new Error('Query error: Can only parse strings got: ' . $valueNode->kind, [$valueNode]);
        }
        if (!filter_var($valueNode->value, FILTER_VALIDATE_EMAIL)) {
            throw new Error("Not a valid email", [$valueNode]);
        }
        return $valueNode->value;
    }
}

【问题讨论】:

    标签: php graphql laravel-lighthouse


    【解决方案1】:

    (编辑:查看下面 Enzo Notario 的评论,以获得真正的解决方案)

    我通过以下方式解决了这个问题:

    在“composer.json”中,我将文件夹“graphql”(EmailType 类文件所在的文件夹)添加到“autoload”中的文件夹列表中:

    "autoload": {
            "psr-4": {
                "App\\": "app/"
            },
            "classmap": [
                "database/seeds",
                "database/factories",
                "graphql"
            ]
        },
    

    然后我使用了以下命令(我很确定最后一行不需要):

    php artisan clear-compiled
    composer dumpautoload
    composer update
    

    在这个 al 按预期工作之后。

    【讨论】:

    • 它之所以有效,是因为composer dump-autoload 它“发现”了所有类。但我认为迟早你会遇到一些麻烦(尤其是在你的生产环境中)。因此,我建议您修改标量的名称空间/路径,使其完美匹配并且正常工作。例如,您可以将其放在App\Graphql\Scalars(以及文件夹app/Graphql/Scalars)中
    • 我按照您的建议更改了命名空间。它现在可以在没有composer dump-autoload 的情况下工作。我没有意识到命名空间和文件名需要匹配。感谢您指出这一点。
    猜你喜欢
    • 1970-01-01
    • 2020-01-18
    • 2019-04-25
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2018-09-23
    • 2020-06-01
    相关资源
    最近更新 更多