Releases: rebing/graphql-laravel
9.0.0-rc1
Welcome to RC1 of the new 9.0 release cycle!
That's the good news, the "bad" news is in fact all of the changes bring breaking changes. Some induced due to transitive change updates, others directly due to feature removal / easing of maintenance.
Please carefully read through the changelog!
Breaking changes
Added
-
Upgrade to graphql-php 15 #953 / mfn
This includes possible breaking changes also outside of this package, see also https://github.com/webonyx/graphql-php/releases/tag/v15.0.0
Known breaking changes:- non-standard error related data keys are not included directly in
errors.*.<non-standard error key>
any more, but have been moved to
errors.*.extensions.<non-standard error key>
.
Also new keys may appear here from upstream. - The
errors.*.extensions.category
has been removed upstream, but we try to
keep it alive with the interface
\Rebing\GraphQL\Error\ProvidesErrorCategory
as it can be a useful
discriminator on the client side in certain cases. But only the cases from
this library are preserved, e.g. categories likerequest
,graphql
or
internal
are gone. - The
\Rebing\GraphQL\Support\OperationParams
has added required types due to
its base class changes:- Old:
public function getOriginalInput($key)
new:public function getOriginalInput(string $key)
- Old:
public function isReadOnly()
new:public function isReadOnly(): bool
- Old:
Some BC may happen also if you extended code originating in graphql-php,
some examples:- if you implement custom types, you now have to use property types for e.g.
$name
or$description
- If you used any
\GraphQL\Validator\DocumentValidator
in your code
directly, you now need use FQCN to reference them and not the shortened
string names. ->getWrappedType(true)
was replaced with->getInnermostType()
- the class
\GraphQL\Type\Definition\FieldArgument
has been renamed to
\GraphQL\Type\Definition\Argument
- non-standard error related data keys are not included directly in
Removed
- Remove support for eager loading (=non-lazy loading) of types
Lazy loading has been introduced in 2.0.0 (2019-08) and has been made the
default since 8.0.0 (2021-11).
The practical impact is that types are always going to be resolved using a
type loader and therefore cannot use aliases anymore. Types and their type
name have to match. - Remove integrated GraphiQL support in favour of https://github.com/mll-lab/laravel-graphiql #986 / mfn
- Laravel 6 is no longer supported #967 / mfn
Changed
- The type resolver is now able to resolve the top level types 'Query',
'Mutation' and 'Subscription'
Full Changelog: 8.6.0...9.0.0-rc1
8.6.0
8.5.0
What's Changed
Added
- Add support for thecodingmachine/safe 2.4 #961 / tranvantri
New Contributors
- @tranvantri made their first contribution in #961
Full Changelog: 8.4.0...8.5.0
8.4.0
8.3.0
What's Changed
Added
- Add support to use array in
controller
param in config #906 / viktorruskai - Add support for laravel validation attributes #901 / jacobdekeizer
Fixed
- Allow 'always' to work on object types #473 / tinyoverflow #369 / zjbarg
- Allow using addSelect() in relationship query scopes #875 / codercms
Removed
- Support for PHP 7.2, PHP 7.3 and Laravel 7.0 (all EOL) #914 / mfn
New Contributors
- @getsolaris made their first contribution in #908
- @nhedger made their first contribution in #910
- @viktorruskai made their first contribution in #906
- @jacobdekeizer made their first contribution in #901
Full Changelog: 8.2.1...8.3.0
8.2.1
8.2.0
Fixed
- Fix "No configuration for schema '' found" when route prefix is empty string \888 / hello-liang-shan
8.1.0
Added
- Support for Laravel 9 #879 / mfn
8.0.0 🎉
After quite some RC cycles, the next major release finally arrived!
Note: this new release contains a LOT of BREAKING CHANGES, please make sure to review the change changelog and test before you deploy!
High level changes:
- routing has been rewritten/simplified
- processing of GraphQL requests has been unified to better accommodate for optional features like Automatic Persisted Queries (APQ)
- lots-o-breaking changes and clean ups
- Support for Lumen has been removed
Please find all the details below:
Breaking changes
-
Rewrite and simplify how schemas are handled
\Rebing\GraphQL\GraphQL::$schemas
now only holdsSchema
s and not a
mixture of strings or arrays\Rebing\GraphQL\GraphQL::schema()
now only accepts a "schema name", but no
ad hocSchema
or "schema configs". To use ad hoc schemas, use
\Rebing\GraphQL\GraphQL::buildSchemaFromConfig()
and
\Rebing\GraphQL\GraphQL::addSchema()
\Rebing\GraphQL\GraphQL::queryAndReturnResult()
(and thus also
\Rebing\GraphQL\GraphQL::query()
) does not accept ad hoc schemas via
$opts['schema']
anymore; it now only can reference a schema via its name.\Rebing\GraphQL\GraphQL::addSchema()
now only acceptSchema
objects,
where before it would support ad hoc schemas via array configuration.
Use\Rebing\GraphQL\GraphQL::buildSchemaFromConfig()
for that now.\Rebing\GraphQL\GraphQL::getSchemaConfiguration()
has been removed due to
the simplifications.\Rebing\GraphQL\GraphQL::getNormalizedSchemaConfiguration()
does not
support ad hoc schemas anymore and only accepts the schema name.\Rebing\GraphQL\GraphQLServiceProvider::bootSchemas()
has been removed due
to the simplifications.
-
The following methods now take a
\Illuminate\Contracts\Config\Repository
as
second argument:\Rebing\GraphQL\GraphQL::__construct
\Rebing\GraphQL\GraphQLServiceProvider::applySecurityRules
-
As part of moving the architecture to an execution based middleware approach,
the following methods have been removed:\Rebing\GraphQL\GraphQLController::handleAutomaticPersistQueries
has been
replaced by theAutomaticPersistedQueriesMiddleware
middleware\Rebing\GraphQL\GraphQLController::queryContext
has been
replaced by theAddAuthUserContextValueMiddleware
middleware
If you relied on overridingqueryContext
to inject a custom context, you
now need to create your own execution middleware and add to your
configuration\Rebing\GraphQL\GraphQLController::executeQuery
has become obsolete, no
direct replacement.
-
Routing has been rewritten and simplified #757 / mfn
- All routing related configuration is now within the top level
route
configuration key - The following configuration options have been removed:
graphql.routes
It's therefore also not possible anymore to register different routes for
queries and mutations within a schema. Each schema gets only one route
(except for the default schema, which is registered for the global prefix
route as well as under its name).
If necessary, this can be emulated with different schemas and multi-level
paths
- The following configuration options have been moved/renamed:
graphql.prefix
=>graphql.route.prefix
graphql.controllers
=>graphql.route.controller
Further, providing a controller action forquery
ormutation
is not
supported anymore.graphql.middleware
=>graphql.route.middleware
graphql.route_group_attributes
=>graphql.route.group_attributes
- The actual routes defined have changed:
- No more separate routes for the HTTP methods
- 1 route for each schema + 1 route for the group prefix (default schema)
- If GraphiQL is enabled: 1 route graphiql route for each schema + 1 for the
graphiql group prefix (default schema) - If provided, the
'method'
argument must provide the HTTP method
verbs in uppercase likePOST
orGET
,post
orget
will not work.
- It's now possible to prevent the registering of any routes by making the top
levelroute
an empty array or null \Rebing\GraphQL\GraphQL::routeNameTransformer
has been removed- It's now possible to register schemas with a
-
in their name - Routes are now properly cacheable
- All routing related configuration is now within the top level
-
Remove the
\Rebing\GraphQL\GraphQLController::$app
property #755 / mfn
Injecting the application container early is incompatible when running within
an application server like laravel/octane, as it's not guaranteed that the
container received contains all the bindings. If you relied on this property
when extending the classes, invoke the container directly via
Container::getInstance()
. -
Remove deprecated
\Rebing\GraphQL\Support\Type::$inputObject
and\Rebing\GraphQL\Support\Type::$enumObject
properties #752 / mfn
Instead in your code, extend\Rebing\GraphQL\Support\InputType
and\Rebing\GraphQL\Support\EnumType
directly -
Support for Lumen has been removed
-
Integrate laragraph/utils RequestParser #739 / mfn
The parsing of GraphQL requests is now more strict:- if you send a
GET
request, the GraphQL query has to be in the query parameters - if you send a
POST
request, the GraphQL query needs to be in the body
Mixing of either isn't possible anymore - batched queries will only work with
POST
requests
This is due toRequestParser
using\GraphQL\Server\Helper::parseRequestParams
which includes this check
Further: - Drop support for configuration the name of the variable for the variables (
params_key
) GraphQLUploadMiddleware
has been removed (RequestParser
includes this functionality)- Empty GraphQL queries now return a proper validated GraphQL error
- if you send a
-
In
\Rebing\GraphQL\GraphQL
, renamed remaining instances of$params
to$variables
After switching toRequestParser
, the support for changing the variable name
what was supposed toparams_key
has gone and thus the name isn't fitting anymore.
Also, the default value for$variables
has been changed tonull
to better
fit the howOperationParams
works:-
old:
public function query(string $query, ?array $params = [], array $opts = []): array
new:public function query(string $query, ?array $variables = null, array $opts = []): array
-
old:
public function queryAndReturnResult(string $query, ?array $params = [], array $opts = []): ExecutionResult
new:public function queryAndReturnResult(string $query, ?array $variables = null, array $opts = []): ExecutionResult
-
\Rebing\GraphQL\Support\ResolveInfoFieldsAndArguments
has been removed -
$getSelectFields
closure no longer takes a depth parameter
-
-
The
$args
argument, of thehandle
method of the execution middlewares requiresarray
as type.
Added
- Command to make an execution middleware #772 / mfn
- Command to make a schema configuration #830 / matsn0w
- The primary execution of the GraphQL request is now piped through middlewares #762 / crissi and mfn
This allows greater flexibility for enabling/disabling certain functionality
as well as bringing in new features without having to open up the library. - Primarily register \Rebing\GraphQL\GraphQL as service and keep
'graphql'
as alias #768 / mfn - Automatic Persisted Queries (APQ) now cache the parsed query #740 / mfn
This avoids having to re-parse the same queries over and over again. - Add ability to detect unused GraphQL variables #660 / mfn
- Laravel's
ValidationException
is now formatted the same way as aValidationError
#748 / mfn - A few missing typehints (mostly array related) #849 / mfn
Changed
- Internally webonyx query plan feature is now used for retrieving information about a query #793 / crissi)
- Rewrite and simplify how schemas are handled #779 / mfn
- Internally stop using the global
config()
function and preferable use the repository or the Facade otherwise #774 / mfn - Don't silence broken schemas when normalizing them for generating routes #766 / mfn
- Lazy loading types has been enabled by default #758 / mfn
- Make it easier to extend select fields #799 / crissi
- The
$args
argument, of thehandle
method of the execution middlewares requiresarray
as type #843 / sforward - Embrace thecodingmachine/safe and use thecodingmachine/phpstan-safe-rule to enforce it #851 / mfn
- Don't require a return value for the query option of fields #856 / sforward
Fixed
- Fix
TypeNotFound
when an interf...
8.0.0-rc6 / "one more RC release…"
Changes since the last RC
- A few missing typehints (mostly array related) #849 / mfn
- Embrace thecodingmachine/safe and use thecodingmachine/phpstan-safe-rule to enforce it #851 / mfn
Full ChangeLog since 7.2.0
Breaking changes
-
Rewrite and simplify how schemas are handled
\Rebing\GraphQL\GraphQL::$schemas
now only holdsSchema
s and not a
mixture of strings or arrays\Rebing\GraphQL\GraphQL::schema()
now only accepts a "schema name", but no
ad hocSchema
or "schema configs". To use ad hoc schemas, use
\Rebing\GraphQL\GraphQL::buildSchemaFromConfig()
and
\Rebing\GraphQL\GraphQL::addSchema()
\Rebing\GraphQL\GraphQL::queryAndReturnResult()
(and thus also
\Rebing\GraphQL\GraphQL::query()
) does not accept ad hoc schemas via
$opts['schema']
anymore; it now only can reference a schema via its name.\Rebing\GraphQL\GraphQL::addSchema()
now only acceptSchema
objects,
where before it would support ad hoc schemas via array configuration.
Use\Rebing\GraphQL\GraphQL::buildSchemaFromConfig()
for that now.\Rebing\GraphQL\GraphQL::getSchemaConfiguration()
has been removed due to
the simplifications.\Rebing\GraphQL\GraphQL::getNormalizedSchemaConfiguration()
does not
support ad hoc schemas anymore and only accepts the schema name.\Rebing\GraphQL\GraphQLServiceProvider::bootSchemas()
has been removed due
to the simplifications.
-
The following methods now take a
\Illuminate\Contracts\Config\Repository
as
second argument:\Rebing\GraphQL\GraphQL::__construct
\Rebing\GraphQL\GraphQLServiceProvider::applySecurityRules
-
As part of moving the architecture to an execution based middleware approach,
the following methods have been removed:\Rebing\GraphQL\GraphQLController::handleAutomaticPersistQueries
has been
replaced by theAutomaticPersistedQueriesMiddleware
middleware\Rebing\GraphQL\GraphQLController::queryContext
has been
replaced by theAddAuthUserContextValueMiddleware
middleware
If you relied on overridingqueryContext
to inject a custom context, you
now need to create your own execution middleware and add to your
configuration\Rebing\GraphQL\GraphQLController::executeQuery
has become obsolete, no
direct replacement.
-
Routing has been rewritten and simplified #757 / mfn
- All routing related configuration is now within the top level
route
configuration key - The following configuration options have been removed:
graphql.routes
It's therefore also not possible anymore to register different routes for
queries and mutations within a schema. Each schema gets only one route
(except for the default schema, which is registered for the global prefix
route as well as under its name).
If necessary, this can be emulated with different schemas and multi-level
paths
- The following configuration options have been moved/renamed:
graphql.prefix
=>graphql.route.prefix
graphql.controllers
=>graphql.route.controller
Further, providing a controller action forquery
ormutation
is not
supported anymore.graphql.middleware
=>graphql.route.middleware
graphql.route_group_attributes
=>graphql.route.group_attributes
- The actual routes defined have changed:
- No more separate routes for the HTTP methods
- 1 route for each schema + 1 route for the group prefix (default schema)
- If GraphiQL is enabled: 1 route graphiql route for each schema + 1 for the
graphiql group prefix (default schema) - If provided, the
'method'
argument must provide the HTTP method
verbs in uppercase likePOST
orGET
,post
orget
will not work.
- It's now possible to prevent the registering of any routes by making the top
levelroute
an empty array or null \Rebing\GraphQL\GraphQL::routeNameTransformer
has been removed- It's now possible to register schemas with a
-
in their name - Routes are now properly cacheable
- All routing related configuration is now within the top level
-
Remove the
\Rebing\GraphQL\GraphQLController::$app
property #755 / mfn
Injecting the application container early is incompatible when running within
an application server like laravel/octane, as it's not guaranteed that the
container received contains all the bindings. If you relied on this property
when extending the classes, invoke the container directly via
Container::getInstance()
. -
Remove deprecated
\Rebing\GraphQL\Support\Type::$inputObject
and\Rebing\GraphQL\Support\Type::$enumObject
properties #752 / mfn
Instead in your code, extend\Rebing\GraphQL\Support\InputType
and\Rebing\GraphQL\Support\EnumType
directly -
Support for Lumen has been removed
-
Integrate laragraph/utils RequestParser #739 / mfn
The parsing of GraphQL requests is now more strict:- if you send a
GET
request, the GraphQL query has to be in the query parameters - if you send a
POST
request, the GraphQL query needs to be in the body
Mixing of either isn't possible anymore - batched queries will only work with
POST
requests
This is due toRequestParser
using\GraphQL\Server\Helper::parseRequestParams
which includes this check
Further: - Drop support for configuration the name of the variable for the variables (
params_key
) GraphQLUploadMiddleware
has been removed (RequestParser
includes this functionality)- Empty GraphQL queries now return a proper validated GraphQL error
- if you send a
-
In
\Rebing\GraphQL\GraphQL
, renamed remaining instances of$params
to$variables
After switching toRequestParser
, the support for changing the variable name
what was supposed toparams_key
has gone and thus the name isn't fitting anymore.
Also, the default value for$variables
has been changed tonull
to better
fit the howOperationParams
works:-
old:
public function query(string $query, ?array $params = [], array $opts = []): array
new:public function query(string $query, ?array $variables = null, array $opts = []): array
-
old:
public function queryAndReturnResult(string $query, ?array $params = [], array $opts = []): ExecutionResult
new:public function queryAndReturnResult(string $query, ?array $variables = null, array $opts = []): ExecutionResult
-
\Rebing\GraphQL\Support\ResolveInfoFieldsAndArguments
has been removed -
$getSelectFields
closure no longer takes a depth parameter
-
-
The
$args
argument, of thehandle
method of the execution middlewares requiresarray
as type.
Added
- Command to make an execution middleware #772 / mfn
- Command to make a schema configuration #830 / matsn0w
- The primary execution of the GraphQL request is now piped through middlewares #762 / crissi and mfn
This allows greater flexibility for enabling/disabling certain functionality
as well as bringing in new features without having to open up the library. - Primarily register \Rebing\GraphQL\GraphQL as service and keep
'graphql'
as alias #768 / mfn - Automatic Persisted Queries (APQ) now cache the parsed query #740 / mfn
This avoids having to re-parse the same queries over and over again. - Add ability to detect unused GraphQL variables #660 / mfn
- Laravel's
ValidationException
is now formatted the same way as aValidationError
#748 / mfn - A few missing typehints (mostly array related) #849 / mfn
Changed
- Internally webonyx query plan feature is now used for retrieving information about a query #793 / crissi)
- Rewrite and simplify how schemas are handled #779 / mfn
- Internally stop using the global
config()
function and preferable use the repository or the Facade otherwise #774 / mfn - Don't silence broken schemas when normalizing them for generating routes #766 / mfn
- Lazy loading types has been enabled by default #758 / mfn
- Make it easier to extend select fields #799 / crissi
- The
$args
argument, of thehandle
method of the execution middlewares requiresarray
as type #843 / sforward - Embrace thecodingmachine/safe and use thecodingmachine/phpstan-safe-rule to enforce it #851 / mfn
Fixed
- Fix
TypeNotFound
when an interface defined after another type where it is used #828 / kasian-sergeev
Removed
- The method
\Rebing\GraphQL\GraphQLServiceProvider::provides
was removed #769 / mfn
It's only relevant for deferred providers which ours howeve...