Skip to content

Releases: rebing/graphql-laravel

8.0.0-rc3 / Schema handling slightly revamped!

25 May 12:28
@mfn mfn
86a89f3
Compare
Choose a tag to compare

Due to some longer standing cleanups and embracing of a more standardized approach how to process the GraphQL request using https://github.com/laragraph/utils , a breaking changes were made for this next major version.

Note: compared to 8.0.0-rc2 , the schema handling as been changed!

To be clear (see below for details): you will need to adapt your configuration file

Breaking changes

  • Rewrite and simplify how schemas are handled

    • \Rebing\GraphQL\GraphQL::$schemas now only holds Schemas and not a
      mixture of strings or arrays
    • \Rebing\GraphQL\GraphQL::schema() now only accepts a "schema name", but no
      ad hoc Schema 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 accept Schema 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 the AutomaticPersistedQueriesMiddleware middleware
    • \Rebing\GraphQL\GraphQLController::queryContext has been
      replaced by the AddAuthUserContextValueMiddleware middleware
      If you relied on overriding queryContext 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 for query or mutation is not
        supported anymore.
      • graphql.middlware => 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)
      • This also means that the per schema config key method (aka HTTP method)
        is not supported anymore
    • It's now possible to prevent the registering of any routes by making the top
      level route 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
  • 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 to RequestParser 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
  • In \Rebing\GraphQL\GraphQL, renamed remaining instances of $params to $variables
    After switching to RequestParser, the support for changing the variable name
    what was supposed to params_key has gone and thus the name isn't fitting anymore.
    Also, the default value for $variables has been changed to null to better
    fit the how OperationParams 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

Added

  • Command to make an exection middleware #772 / mfn
  • 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
  • Laravels ValidationException is now formatted the same way as a ValidationError #748 / mfn

Changed

  • 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

Removed

  • The method \Rebing\GraphQL\GraphQLServiceProvider::provides was removed #769 / mfn
    It's only relevant for deferred providers which ours however isn't (and can't
    be made into with the current Laravel architecture).

8.0.0-rc2 / More Breaking Changes incoming!

11 May 20:14
@mfn mfn
9db21de
Compare
Choose a tag to compare

Due to some longer standing cleanups, embracing of a more standardized approach how to process the GraphQL request using https://github.com/laragraph/utils, and adding a execution middleware, breaking changes were made for this next major version.

Note: the "breaking changes" between 8.0.0-rc1 and rc2 changed, again; please see the full and current changelog below

To be clear (see below for details): you will need to adapt your configuration file

Breaking changes

  • 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 the AutomaticPersistedQueriesMiddleware middleware
    • \Rebing\GraphQL\GraphQLController::queryContext has been
      replaced by the AddAuthUserContextValueMiddleware middleware
      If you relied on overriding queryContext 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 for query or mutation is not
        supported anymore.
      • graphql.middlware => 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)
      • This also means that the per schema config key method (aka HTTP method)
        is not supported anymore
    • It's now possible to prevent the registering of any routes by making the top
      level route 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
  • 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 to RequestParser 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
  • In \Rebing\GraphQL\GraphQL, renamed remaining instances of $params to $variables
    After switching to RequestParser, the support for changing the variable name
    what was supposed to params_key has gone and thus the name isn't fitting anymore.
    Also, the default value for $variables has been changed to null to better
    fit the how OperationParams 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

Added

  • 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
  • Laravels ValidationException is now formatted the same way as a ValidationError #748 / mfn

Changed

  • Don't silence broken schemas when normalizing them for generating routes #766 / mfn
  • Lazy loading types has been enabled by default #758 / mfn

Removed

  • The method \Rebing\GraphQL\GraphQLServiceProvider::provides was removed #769 / mfn
    It's only relevant for deferred providers which ours however isn't (and can't
    be made into with the current Laravel architecture).

8.0.0-rc1 / Breaking Changes incoming!

25 Apr 18:55
@mfn mfn
d793b5c
Compare
Choose a tag to compare
Pre-release

Due to some longer standing cleanups and embracing of a more standardized approach how to process the GraphQL request using https://github.com/laragraph/utils , a few breaking changes were made for this next major version.

To be clear (see below for details): you will need to adapt your configuration file

Breaking changes

  • 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 for query or mutation is not
        supported anymore.
      • graphql.middlware => 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)
    • It's now possible to prevent the registering of any routes by making the top
      level route an empty array or null
    • \Rebing\GraphQL\GraphQL::routeNameTransformer has been removed
    • It's not possible to register schemas with a - in their name
  • 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
      Further:
    • batched queries will only work with POST requests
      This is due to RequestParser using \GraphQL\Server\Helper::parseRequestParams which includes this check
    • 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
    • Signature changes In \Rebing\GraphQL\GraphQLController:
      • old: protected function executeQuery(string $schema, array $input): array
        new: protected function executeQuery(string $schema, OperationParams $params): array
      • old: protected function queryContext(string $query, ?array $params, string $schema)
        new: protected function queryContext(string $query, ?array $variables, string $schema)
      • old: protected function handleAutomaticPersistQueries(string $schemaName, array $input): string
        new: protected function handleAutomaticPersistQueries(string $schemaName, OperationParams $operation): string
  • In \Rebing\GraphQL\GraphQLController, renamed all occurrences of $schema to $schemaName
    This is to reduce the confusion as the code in some other places uses $schema
    for the actual schema itself (either as an object or array form).
    This changes the signature on the following methods:

    • old: protected function executeQuery(string $schema, OperationParams $params): array
      new: protected function executeQuery(string $schemaName, OperationParams $params): array
    • old: protected function queryContext(string $query, ?array $variables, string $schema)
      new: protected function queryContext(string $query, ?array $variables, string $schemaName)
  • In \Rebing\GraphQL\GraphQL, renamed remaining instances of $params to $variables
    After switching to RequestParser, the support for changing the variable name
    what was supposed to params_key has gone and thus the name isn't fitting anymore

    • old: public function query(string $query, ?array $params = [], array $opts = []): array
      new: public function query(string $query, ?array $variables = [], array $opts = []): array
    • old: public function queryAndReturnResult(string $query, ?array $params = [], array $opts = []): ExecutionResult
      new: public function queryAndReturnResult(string $query, ?array $variables = [], array $opts = []): ExecutionResult
  • As part of APQ parsed query support #740 / mfn:

    • In \Rebing\GraphQL\GraphQLController, the following signature changed:
      • old: protected function handleAutomaticPersistQueries(string $schemaName, OperationParams $operation): string
        new: protected function handleAutomaticPersistQueries(string $schemaName, OperationParams $operation): array
    • In \Rebing\GraphQL\GraphQL, the following signature changed:
      • old: public function query(string $query, ?array $variables = [], array $opts = []): array
        new: public function query($query, ?array $variables = [], array $opts = []): array
      • old: public function queryAndReturnResult(string $query, ?array $variables = [], array $opts = []): ExecutionResult
        new: public function queryAndReturnResult($query, ?array $variables = [], array $opts = []): ExecutionResult

Added

  • 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
  • Laravels ValidationException is now formatted the same way as a ValidationError #748 / mfn

Changed

  • Lazy loading types has been enabled by default #758 / mfn

7.2.0

10 Apr 20:09
@mfn mfn
b602945
Compare
Choose a tag to compare

Added

7.1.0

08 Apr 11:57
@mfn mfn
c2c74b2
Compare
Choose a tag to compare

Added

7.0.1

05 Apr 19:44
@mfn mfn
8d49e7d
Compare
Choose a tag to compare

Added

7.0.0

03 Apr 20:36
@mfn mfn
897a162
Compare
Choose a tag to compare

Breaking changes

  • Signature of \Rebing\GraphQL\Support\Privacy::validate changed, now it accepts both query/mutation arguments and the query/mutation context.
    Update your existing privacy policies this way:
    -public function validate(array $queryArgs): bool
    +public function validate(array $queryArgs, $queryContext = null): bool

Added

  • Ability to pass query/mutation context to the field privacy handler (both closure and class) #727 / torunar

6.5.0

03 Apr 19:56
@mfn mfn
4743033
Compare
Choose a tag to compare

Fixed

6.4.0

31 Mar 18:52
@mfn mfn
affac63
Compare
Choose a tag to compare

Added

6.3.0

12 Mar 17:00
@mfn mfn
4a12c13
Compare
Choose a tag to compare

Added