1

在文档中尝试这部分没有成功,并且在互联网上没有找到任何好的参考。我想动态添加模式类型,并认为可以通过 GraphQLServiceProvider 中的 typeregistry 添加它们,但是当我尝试在 graphql-playground 中使用该类型时,它显示在模式错误中找不到类型。我注册的类型似乎没有加载到我不知道该怎么做的模式中。

我尝试过的事情:将提供程序添加到我的应用程序配置中。跑“作曲家转储自动加载”清除缓存和配置。

这是我的 GraphQLServiceProvider 代码

<?php

declare(strict_types=1);

namespace App\Providers;

use GraphQL\Type\Definition\Type;
use Illuminate\Support\ServiceProvider;
use GraphQL\Type\Definition\ObjectType;
use Nuwave\Lighthouse\Schema\TypeRegistry;

class GraphQLServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @param TypeRegistry $typeRegistry
     *
     * @return void
     */
    public function boot(TypeRegistry $typeRegistry): void
    {
        $typeRegistry->register(
             new ObjectType([
                 'name' => 'Comment',
                 'fields' => function() use ($typeRegistry): array {
                     return [
                         'id' => [
                            'type' => Type::id()
                         ],
                         'content' => [
                            'type' => Type::string()
                         ],
                         'date_created' => [
                            'type' => Type::string()
                         ],
                         'updated_at' => [
                            'type' => Type::string()
                         ]
                     ];
                 }
             ])
        );
    }
}

这是我的架构

"A datetime string with format `Y-m-d H:i:s`, e.g. `2018-01-01 13:00:00`."
scalar DateTime @scalar(class: "Nuwave\\Lighthouse\\Schema\\Types\\Scalars\\DateTime")

"A date string with format `Y-m-d`, e.g. `2011-05-23`."
scalar Date @scalar(class: "Nuwave\\Lighthouse\\Schema\\Types\\Scalars\\Date")

type Query {
    users: [User!]! @paginate(defaultCount: 10)
    user(id: ID @eq): User @find
    posts: [Post!]! @all
    comments: [Comment!]! @all
}

type User {
    id: ID!
    name: String!
    email: String!
    created_at: DateTime!
    updated_at: DateTime!
}

type Post {
    id: ID!
    title: String!
    content: String!
    created_at: DateTime!
    updated_at: DateTime!
}
4

3 回答 3

3

你注册了GraphQLServiceProvider吗?所有服务提供者都在 中注册config/app.php,将您的提供者添加到数组中,例如:

'providers' => [
    // Other Service Providers
    App\Providers\GraphQLServiceProvider::class,
],
于 2020-01-09T12:41:32.637 回答
2

我刚刚在我的项目中尝试了代码的和平,它可以工作。所以你的代码实际上很好。

请检查您的灯塔配置,可能您已启用缓存。LIGHTHOUSE_CACHE_ENABLE您可以使用环境变量 ( true/ )启用/禁用缓存false

如果您使用灯塔缓存(如在生产中),请不要忘记在更改后清除灯塔缓存php artisan lighthouse:clear-cache

我希望它有帮助

于 2020-01-03T11:28:08.900 回答
0

注入模式的另一种方法是这样的:

use GraphQL\Language\AST\EnumTypeDefinitionNode;
use Illuminate\Contracts\Events\Dispatcher;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider;
use Modules\AccessControl\Entities\Permission;
use Nuwave\Lighthouse\Events\ManipulateAST;
use Nuwave\Lighthouse\Schema\AST\PartialParser;
use Nuwave\Lighthouse\Schema\Factories\DirectiveFactory;

class GraphQLEnumPermissionServiceProvider extends ServiceProvider
{
    public function boot(DirectiveFactory $directiveFactory, Dispatcher $dispatcher): void
    {
        if (Schema::hasTable(with(new Permission)->getTable())) {
        $permissions = Permission::all();
    }
    else {
        $permissions = (object) [ (object) ['id' => '0', 'ui_name' => 'bar']]; // to pass the schema validation when is empty
    }

    // we need to check if we have permissions in the system
    $dispatcher->listen(
        ManipulateAST::class,
        function (ManipulateAST $manipulateAST) use($permissions): void {
            $manipulateAST->documentAST
                ->setTypeDefinition(
                    static::createEnumType(
                        'EnumObjectName',
                        'EnumObjectName description',
                        $permissions
                    )
                );
        }
    );
}

public static function createEnumType(string $name, string $description, object $enumValues): EnumTypeDefinitionNode
    {
        $enumDefinition = "\"$description\"\n";
        $enumDefinition .= "enum $name {\n";
        foreach ($enumValues as $i => $permission) {
            if(!empty($permission->description)) {
                $enumDefinition .= "\"{$permission->description}\"\n";
            }

            $enumDefinition .= $permission->ui_name . " @enum(value: \"".$permission->id."\")\n\n";
        }
        $enumDefinition .= "}\n";

        return PartialParser::enumTypeDefinition($enumDefinition);
    }
}

指令@whereConstraints 是这样写的

于 2020-01-06T19:10:36.753 回答