This library allow using GraphQL subscription over Mercure protocol with any implementation of GraphQL PHP. It Comes out-of-the-box with a Symfony Bridge so it can be easily combine with OverblogGraphQLBundle or API Platform or other Symfony implementation based on GraphQL PHP.
composer req overblog/graphql-subscription
<?php
use GraphQL\Executor\ExecutionResult;
use GraphQL\GraphQL;
function (
$schema,
$source,
$rootValue = null,
$context = null,
$variableValues = null,
?string $operationName = null
): ExecutionResult {
return GraphQL::executeQuery(...func_get_args());
}
This library does not handle natively CORS preflight headers.
Add the OverblogGraphQLSubscriptionBundle to your application's kernel:
public function registerBundles()
{
$bundles = [
// ...
new Overblog\GraphQLSubscription\Bridge\Symfony\OverblogGraphQLSubscriptionBundle(),
// ...
];
// ...
}
Symfony Flex generates:
default configuration in config/packages/graphql_subscription.yaml
.
overblog_graphql_subscription:
topic_url_pattern: "http://localhost:8000/subscriptions/{channel}/{id}.json"
mercure_hub:
# Will use the mercure bundle default publisher
handler_id: ~
# Uncomment to use without mercure bundle
# url: "https://mercure.roks/hub"
# publish:
# secret_key: "!mySuperPublisherSecretKey!"
# Uncomment to expose public hubUrl on start in payload
# public_url: "https://mercure.roks/hub"
subscribe:
secret_key: "!mySuperSubscriberSecretKey!"
# Uncomment to modify storage filesystem default path
# storage:
# path: "%kernel.project_dir%/var/graphql-subscriber"
# The graphql query handler
# for OverblogGraphQLBundle: "Overblog\\GraphQLBundle\\Request\\Executor::execute"
# for API-Plateform: "api_platform.graphql.executor::executeQuery"
graphql_executor: ~
schema_builder: ~
default routes in config/routes/graphql_subscription.yaml
overblog_graphql_subscription_endpoint:
resource: "@OverblogGraphQLSubscriptionBundle/Resources/config/routing/single.yaml"
prefix: /subscriptions
# Only for Symfony >= 4.2
# trailing_slash_on_root: false
# Uncomment to enabled multiple schema
#overblog_graphql_subscription_multiple_endpoint:
# resource: "@OverblogGraphQLSubscriptionBundle/Resources/config/routing/multiple.yaml"
# prefix: /subscriptions
NelmioCorsBundle is recommended to manage CORS preflight, follow instructions to install it.
Here a configuration assuming that subscription endpoint is /subscriptions
:
nelmio_cors:
defaults:
origin_regex: true
allow_origin: ['%env(CORS_ALLOW_ORIGIN)%']
allow_methods: ['GET', 'OPTIONS', 'POST']
allow_headers: ['Content-Type']
max_age: 3600
paths:
'^/subscriptions': ~