Skip to content

Latest commit

 

History

History
111 lines (95 loc) · 2.48 KB

graphql-attribute-schema.md

File metadata and controls

111 lines (95 loc) · 2.48 KB
name description url github
graphql-attribute-schema
Easily build your GraphQL schema for webonyx/graphql-php using PHP attributes instead of large configuration arrays.
jerowork/graphql-attribute-schema

Easily build your GraphQL schema for webonyx/graphql-php using PHP attributes instead of large configuration arrays.

A simple example:

use Jerowork\GraphqlAttributeSchema\Attribute\Enum;
use Jerowork\GraphqlAttributeSchema\Attribute\Field;
use Jerowork\GraphqlAttributeSchema\Attribute\InputType;
use Jerowork\GraphqlAttributeSchema\Attribute\Mutation;
use Jerowork\GraphqlAttributeSchema\Attribute\Query;
use Jerowork\GraphqlAttributeSchema\Attribute\Type;

final readonly class CreateUserMutation
{
    #[Mutation]
    public function createUser(CreateUserInputType $input): User
    {
        // Business logic to create a user
    }
}

final readonly class UserQuery
{
    #[Query(description: 'Get a user')]
    public function user(int $userid): User
    {
        // Fetch and return user data
    }
}

#[InputType]
final readonly class CreateUserInputType
{
    public function __construct(
        #[Field]
        public int $userId,
        #[Field]
        public string $name,
        #[Field(name: 'phoneNumber')]
        public ?string $phone,
    ) {}
}

#[Type]
final readonly class User
{
    // Define fields as class properties
    public function __construct(
        #[Field]
        public int $userId,
        #[Field]
        public string $name,
        public ?string $phone,
        #[Field(description: 'The status of the user')]
        public UserStatusType $status,
    ) {}

    // Define fields with methods for additional logic
    #[Field]
    public function getPhoneNumber(): string
    {
        return sprintf('+31%s', $this->phone);
    }
}

#[Enum(description: 'The status of the user')]
enum UserStatusType: string
{
    case Created = 'CREATED';
    case Removed = 'REMOVED';
}

This will result in the following GraphQL schema:

type Mutation {
  createUser(input: CreateUserInput!): User!
}

type Query {
  user(userId: Int!): User!
}

input CreateUserInput {
  userId: Int!
  name: String!
  phoneNumber: String
}

type User {
  userId: Int!
  name: String!
  status: UserStatus!
  phoneNumber: String
}

enum UserStatus {
  CREATED
  REMOVED
}

Available attributes: Mutation, Query, Type, InterfaceType, InputType, Enum, EnumValue, Field, Arg, Autowire, Scalar, Cursor