簡體   English   中英

Graphql 自定義類型定義 Laravel Lighthouse 給出關於缺少子類的錯誤

[英]Graphql Custom type-definition Laravel Lighthouse gives error about missing subClass

我復制了 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;
    }
}

(編輯:看看下面 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 按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM