Skip to main content
Version: 7.0.0



Breaking Changes

  • #664 Replaces thecodingmachine/class-explorer with kcs/class-finder resulting in the SchemaFactory::setClassNameMapper being renamed to SchemaFactory::setFinder. This now expects an instance of Kcs\ClassFinder\Finder instead of Kcs\ClassFinder\Finder\FinderInterface. @fogrye

New Features

  • #649 Adds support for subscription operations. @oojacoboo
  • #612 Automatic query complexity analysis. @oprypkhantc
  • #611 Automatic persisted queries. @oprypkhantc


  • #658 Improves on prefetching for nested fields. @grynchuk
  • #646 Improves exception handling during schema parsing. @fogrye
  • #636 Allows the use of middleware on construtor params/fields. @oprypkhantc
  • #623 Improves support for description arguments on types/fields. @downace
  • #628 Properly handles @param annotations for generics support on field annotated constructor arguments. @oojacoboo
  • #584 Immutability improvements across the codebase. @oprypkhantc
  • #588 Prefetch improvements. @oprpkhantc
  • #606 Adds support for phpdoc descriptions and deprecation annotations on native enums. @mdoelker
  • Thanks to @shish, @cvergne and @mshapovalov for updating the docs!

Minor Changes

  • #639 Added support for Symfony 7. @janatjak


Adds support for Psr\Container 1.1 with #601


This is a very simple release. We support Doctrine annotation 1.x and we've deprecated SchemaFactory::setDoctrineAnnotationReader in favor of native PHP attributes.


  • Added support for new Void return types, allowing use of void from operation resolvers. #574
  • Improvements with authorization middleware #571
  • Updated vendor dependencies: #580 #558


Lots of little nuggets in this release! We're now targeting PHP ^8.1 and have testing on 8.2.

  • Better support for union types and enums: #530, #535, #561, #570
  • Various bug and interface fixes: #532, #575, #564
  • GraphQL v15 required: #542
  • Lots of codebase improvements, more strict typing: #548

A special thanks to @rusted-love and @oprypkhantc for their contributions.


A shoutout to @bladl for his work on this release, improving the code for better typing and PHP 8.0 syntax updates!

Breaking Changes

  • #518 PSR-11 support now requires version 2
  • #508 Due to some of the code improvements, additional typing has been added to some interfaces/classes. For instance, RootTypeMapperInterface::toGraphQLOutputType and RootTypeMapperInterface::toGraphQLInputType now have the following signatures:
* @param (OutputType&GraphQLType)|null $subType
* @return OutputType&GraphQLType
public function toGraphQLOutputType(
Type $type,
OutputType|null $subType,
ReflectionMethod|ReflectionProperty $reflector,
DocBlock $docBlockObj
): OutputType;

* @param (InputType&GraphQLType)|null $subType
* @return InputType&GraphQLType
public function toGraphQLInputType(
Type $type,
InputType|null $subType,
string $argumentName,
ReflectionMethod|ReflectionProperty $reflector,
DocBlock $docBlockObj
): InputType;


  • #510
  • #508




Breaking change

  • The method setAnnotationCacheDir($directory) has been removed from the SchemaFactory. The annotation cache will use your Psr\SimpleCache\CacheInterface compliant cache handler set through the SchemaFactory constructor.

Minor changes

  • Removed dependency for doctrine/cache and unified some of the cache layers following a PSR interface.
  • Cleaned up some of the documentation in an attempt to get things accurate with versioned releases.


Breaking change

The method signature for toGraphQLOutputType and toGraphQLInputType have been changed to the following:

* @param \ReflectionMethod|\ReflectionProperty $reflector
public function toGraphQLOutputType(Type $type, ?OutputType $subType, $reflector, DocBlock $docBlockObj): OutputType;

* @param \ReflectionMethod|\ReflectionProperty $reflector
public function toGraphQLInputType(Type $type, ?InputType $subType, string $argumentName, $reflector, DocBlock $docBlockObj): InputType;

New features

  • @Input annotation is introduced as an alternative to @Factory. Now GraphQL input type can be created in the same manner as @Type in combination with @Field - example.
  • New attributes has been added to @Field annotation: for, inputType and description.
  • The following annotations now can be applied to class properties directly: @Field, @Logged, @Right, @FailWith, @HideIfUnauthorized and @Security.


Breaking change

There is one breaking change introduced in the minor version (this was important to allow PHP 8 compatibility).

  • The ecodev/graphql-upload package (used to get support for file uploads in GraphQL input types) is now a "recommended" dependency only. If you are using GraphQL file uploads, you need to add ecodev/graphql-upload to your composer.json.

New features

  • All annotations can now be accessed as PHP 8 attributes
  • The @deprecated annotation in your PHP code translates into deprecated fields in your GraphQL schema
  • You can now specify the GraphQL name of the Enum types you define
  • Added the possibility to inject pure Webonyx objects in GraphQLite schema

Minor changes

  • Migrated from zend/diactoros to laminas/diactoros
  • Making the annotation cache directory configurable


  • Migrated from Travis to Github actions


This is a complete refactoring from 3.x. While existing annotations are kept compatible, the internals have completely changed.

New features

Many extension points have been added

  • Added a "root type mapper" (useful to map scalar types to PHP types or to add custom annotations related to resolvers)
  • Added "field middlewares" (useful to add middleware that modify the way GraphQL fields are handled)
  • Added a "parameter type mapper" (useful to add customize parameter resolution or add custom annotations related to parameters)

New framework specific features:


  • The Symfony bundle now provides a "login" and a "logout" mutation (and also a "me" query)



  • The FieldsBuilder class has been split in many different services (FieldsBuilder, TypeHandler, and a chain of root type mappers)
  • The FieldsBuilderFactory class has been completely removed.
  • Overall, there is not much in common internally between 4.x and 3.x. 4.x is much more flexible with many more hook points than 3.x. Try it out!