The following class is enough to create both a Relay-compatible GraphQL server and a hypermedia API supporting modern REST formats (JSON-LD, JSONAPI…):
<?php
namespace AppEntity;
use ApiPlatformCoreAnnotationApiResource;
use DoctrineORMMapping as ORM;
/**
* Greet someone!
*
* @ApiResource
* @ORMEntity
*/
class Greeting
{
/**
* @ORMId
* @ORMColumn(type="guid")
*/
public $id;
/**
* @var string Your nice message
*
* @ORMColumn
*/
public $hello;
}
Other API Platform features include data validation, authentication, authorization, deprecations, cache and GraphiQL integration.
GraPHPinator is feature complete PHP implementation of GraphQL server. Its job is transformation of query string into resolved Json result for a given Schema.
array
s, no mixed types, no variable function arguments - this library doesnt try to save you from verbosity, but makes sure you always know what you’ve got.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
It is framework agnostic with bindings available for Symfony and Laravel. This code declares a “product” query and a “Product” Type:
class ProductController
{
/**
* @Query()
*/
public function product(string $id): Product
{
// Some code that looks for a product and returns it.
}
}
/**
* @Type()
*/
class Product
{
/**
* @Field()
*/
public function getName(): string
{
return $this->name;
}
// ...
}
Other GraphQLite features include validation, security, error handling, loading via data-loader pattern…
To run a Siler hello world script:
type Query {
hello: String
}
<?php
declare(strict_types=1);
require_once '/path/to/vendor/autoload.php';
use SilerDiactoros;
use SilerGraphql;
use SilerHttp;
$typeDefs = file_get_contents(__DIR__.'/schema.graphql');
$resolvers = [
'Query' => [
'hello' => 'world',
],
];
$schema = Graphqlschema($typeDefs, $resolvers);
echo "Server running at http://127.0.0.1:8080";
Httpserver(Graphqlpsr7($schema), function (Throwable $err) {
var_dump($err);
return Diactorosjson([
'error' => true,
'message' => $err->getMessage(),
]);
})()->run();
It also provides functionality for the construction of a WebSocket Subscriptions Server based on how Apollo works.