$model */ public function __construct( protected string $model, protected ?string $customName = null, ) { parent::__construct($customName ?? 'Create'.Str::pascal(class_basename($model))); } public function authorize($root, array $args, $ctx, ?ResolveInfo $resolveInfo = null, ?Closure $getSelectFields = null): bool { $args = collect($args) ->filter(fn ($value): bool => $value instanceof Model) ->values() ->all(); return ($this->response = Gate::inspect('create', [$this->model, ...$args]))->allowed(); } /** * Get the arguments for the create mutation. * * @return Argument[] */ public function arguments(): array { $arguments = []; $baseType = $this->baseType(); if ($baseType instanceof BaseType) { $bindableFields = Arr::where($baseType->fieldClasses(), fn (Field $field): bool => $field instanceof BindableField && $field instanceof CreatableField); $notBindableFields = Arr::where($baseType->fieldClasses(), fn (Field $field): bool => ! $field instanceof BindableField); $arguments[] = $this->resolveBindArguments($bindableFields); $arguments[] = $this->resolveCreateMutationArguments($notBindableFields); } return Arr::flatten($arguments); } /** * @param array $args * @return array */ public function rulesForValidation(array $args = []): array { $baseType = $this->baseType(); if ($baseType instanceof BaseType) { return collect($baseType->fieldClasses()) ->filter(fn (Field $field): bool => $field instanceof CreatableField) ->mapWithKeys(fn (Field&CreatableField $field): array => [$field->getName() => $field->getCreationRules($args)]) ->all(); } return []; } public function type(): Type { return Type::nonNull(GraphQL::type($this->baseType()->getName())); } }