omegacode / jwt-secured-api-graphql
This package extends jwt-secured-api by a graphql implementation.
0.7.0
2021-05-03 17:56 UTC
Requires
- php: >=7.4
- ext-json: *
- guzzlehttp/guzzle: ^6.5
- omegacode/jwt-secured-api-core: *
- overblog/dataloader-php: 0.5.*
- react/promise: 2.7.*
- symfony/var-dumper: ^5.0
- webonyx/graphql-php: ^v14.6
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.16
- kint-php/kint: ^3.3
- phpmd/phpmd: ^2.8
- phpstan/phpstan: 0.12.*
- phpunit/phpunit: ^8.5
- squizlabs/php_codesniffer: ^3.5
README
GraphQL integration for JWT secured API Core
...
Requirements
- PHP 7.4+
- composer
- openssl
- PHP extension ext-json
Integrate GraphQL
Add a subscriber
config/services.yaml
Vendor\MyProject\GraphQLResolverSubscriber: arguments: - '@service_container' tags: - 'kernel.event_subscriber'
src/Subscriber/GraphQLResolverSubscriber.php
<?php declare(strict_types=1); namespace Vendor\MyProject\Subscriber; use OmegaCode\JwtSecuredApiGraphQL\Event\ResolverCollectedEvent; use OmegaCode\JwtSecuredApiGraphQL\GraphQL\Registry\ResolverRegistry; use OmegaCode\JwtSecuredApiGraphQL\GraphQL\Resolver\ResolverInterface; use Psr\Container\ContainerInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Vendor\MyProject\QueryResolver; class GraphQLResolverSubscriber implements EventSubscriberInterface { protected const RESOLVER_CLASSES = [ QueryResolver::class ]; protected ContainerInterface $container; public function __construct(ContainerInterface $container) { $this->container = $container; } public static function getSubscribedEvents(): array { return [ ResolverCollectedEvent::NAME => 'onCollected', ]; } public function onCollected(ResolverCollectedEvent $event): void { $registry = $event->getResolverRegistry(); $registry->clear(); $this->addResolvers($registry); } protected function addResolvers(ResolverRegistry $registry): void { foreach (static::RESOLVER_CLASSES as $resolverClass) { /** @var ResolverInterface $resolverInstance */ $resolverInstance = $this->container->get($resolverClass); $registry->add($resolverInstance, $resolverInstance->getType()); } } }
Add a resolver
src/GraphQL/Resolver/QueryResolver.php
<?php declare(strict_types=1); namespace Vendor\MyProject\GraphQL\Resolver; use GraphQL\Type\Definition\ResolveInfo; use OmegaCode\JwtSecuredApiGraphQL\GraphQL\Context; use OmegaCode\JwtSecuredApiGraphQL\GraphQL\Resolver\ResolverInterface; class QueryResolver implements ResolverInterface { public function __invoke($root, array $args, Context $context, ResolveInfo $info): ?string { if ($info->fieldName === 'greet') { $name = strip_tags($args['name']); return "Hello $name"; } return null; } public function getType(): string { return 'Query'; } }
Add schema
res/graphql/schema.graphql
schema { query: Query } type Query { greet(name: String!): String }
Update .env
Add ENABLE_GRAPHQL_SCHEMA_CACHE="1"
to .env files.