Расширить директиву о маяке - PullRequest
0 голосов
/ 06 марта 2020

Я хочу расширить директиву @modelClass из библиотеки маяка. Я работаю над модульной архитектурой, и у меня нет Eloquent Model, у меня их несколько, и я расширяю свою первую версию Model, поэтому я использую интерфейс для привязки последней модели, которая мне нужна. Что мне нужно сделать, это использовать интерфейс вместо класса модели для разрешения моего объекта типа.

Использование директивы @modelClass должно выглядеть следующим образом:

type User @modelClass(class: "App\\Models\\versionC\\User") {
  id: Int!
  username: String!
}

Так как у меня есть это Связывание:

$this->app->bind(UserInterface::class, User::class)

У меня должно быть что-то вроде:

type User @modelClass(interface: "App\\Interfaces\\UserInterface") {
  id: Int!
  username: String!
}

Но я не могу переопределить или расширить директиву @modelClass.

1 Ответ

0 голосов
/ 06 марта 2020

Решением, которое я нашел, было манипулирование схемой

type User @entity(interface: "App\\Interfaces\\UserInterface") {
  id: Int!
  username: String!
}
class EntityDirective extends BaseDirective implements TypeManipulator
{
    public static function definition(): string
    {
        return /** @lang GraphQL */ <<<'SDL'
"""
Map an interface model class to an object type.
This can be used when an eloquent model it is bind to an interface.
"""
directive @entity(
    """
    The interface class name of the corresponding model binding.
    """
    interface: String!
) on OBJECT
SDL;
    }

    public function manipulateTypeDefinition(DocumentAST &$documentAST, TypeDefinitionNode &$objectType)
    {
        $modelClass = $this->directiveArgValue('interface');
        if(!$modelClass) {
            throw new DefinitionException(
                "An `interface` argument must be assigned to the '{$this->name()}'directive on '{$this->nodeName()}"
            );
        }

        $modelClass = get_class(resolve($modelClass));
        // If the type already exists, we use that instead
        if (isset($documentAST->types[$objectType->name->value])) {
            $objectType = $documentAST->types[$objectType->name->value];
        }

        $objectType->directives = ASTHelper::mergeNodeList(
            $objectType->directives,
            [PartialParser::directive('@modelClass(class: "'.addslashes($modelClass).'")')]
        );

        $documentAST->setTypeDefinition($objectType);
    }
}

для записи, которую я использую lighthouse v4.10

...