1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Drupal\graphql\Controller; |
4
|
|
|
|
5
|
|
|
use Drupal\Core\Cache\CacheableJsonResponse; |
6
|
|
|
use Drupal\Core\DependencyInjection\ContainerInjectionInterface; |
7
|
|
|
use Drupal\graphql\GraphQL\Execution\QueryProcessor; |
8
|
|
|
use Symfony\Component\DependencyInjection\ContainerInterface; |
9
|
|
|
|
10
|
|
|
/** |
11
|
|
|
* Handles GraphQL requests. |
12
|
|
|
*/ |
13
|
|
|
class RequestController implements ContainerInjectionInterface { |
14
|
|
|
|
15
|
|
|
/** |
16
|
|
|
* The query processor. |
17
|
|
|
* |
18
|
|
|
* @var \Drupal\graphql\GraphQL\Execution\QueryProcessor |
19
|
|
|
*/ |
20
|
|
|
protected $processor; |
21
|
|
|
|
22
|
|
|
/** |
23
|
|
|
* The service configuration parameters. |
24
|
|
|
* |
25
|
|
|
* @var array |
26
|
|
|
*/ |
27
|
|
|
protected $parameters; |
28
|
|
|
|
29
|
|
|
/** |
30
|
|
|
* {@inheritdoc} |
31
|
|
|
*/ |
32
|
|
|
public static function create(ContainerInterface $container) { |
33
|
|
|
return new static( |
34
|
|
|
$container->get('graphql.query_processor'), |
35
|
|
|
$container->getParameter('graphql.config') |
36
|
|
|
); |
37
|
|
|
} |
38
|
|
|
|
39
|
|
|
/** |
40
|
|
|
* RequestController constructor. |
41
|
|
|
* |
42
|
|
|
* @param \Drupal\graphql\GraphQL\Execution\QueryProcessor $processor |
43
|
|
|
* The query processor. |
44
|
|
|
* @param array $parameters |
45
|
|
|
* The service configuration parameters. |
46
|
|
|
*/ |
47
|
|
|
public function __construct(QueryProcessor $processor, array $parameters) { |
48
|
|
|
$this->processor = $processor; |
49
|
|
|
$this->parameters = $parameters; |
50
|
|
|
} |
51
|
|
|
|
52
|
|
|
/** |
53
|
|
|
* Handles graphql requests. |
54
|
|
|
* |
55
|
|
|
* @param string $schema |
56
|
|
|
* The name of the schema. |
57
|
|
|
* @param \GraphQL\Server\OperationParams|\GraphQL\Server\OperationParams[] $operations |
58
|
|
|
* The graphql operation(s) to execute. |
59
|
|
|
* |
60
|
|
|
* @return \Drupal\Core\Cache\CacheableJsonResponse |
61
|
|
|
* The JSON formatted response. |
62
|
|
|
*/ |
63
|
|
|
public function handleRequest($schema, $operations) { |
64
|
|
|
$debug = !empty($this->parameters['development']); |
65
|
|
|
|
66
|
|
|
if (is_array($operations)) { |
67
|
|
|
return $this->handleBatch($schema, $operations, $debug); |
68
|
|
|
} |
69
|
|
|
|
70
|
|
|
return $this->handleSingle($schema, $operations, $debug); |
71
|
|
|
} |
72
|
|
|
|
73
|
|
|
/** |
74
|
|
|
* @param $schema |
75
|
|
|
* @param $operations |
76
|
|
|
* @param bool $debug |
77
|
|
|
* |
78
|
|
|
* @return \Drupal\Core\Cache\CacheableJsonResponse |
79
|
|
|
*/ |
80
|
|
View Code Duplication |
protected function handleSingle($schema, $operations, $debug = FALSE) { |
|
|
|
|
81
|
|
|
$result = $this->processor->processQuery($schema, $operations, NULL, $debug); |
82
|
|
|
$response = new CacheableJsonResponse($result); |
83
|
|
|
$response->addCacheableDependency($result); |
84
|
|
|
return $response; |
85
|
|
|
} |
86
|
|
|
|
87
|
|
|
/** |
88
|
|
|
* @param $schema |
89
|
|
|
* @param $operations |
90
|
|
|
* @param bool $debug |
91
|
|
|
* |
92
|
|
|
* @return \Drupal\Core\Cache\CacheableJsonResponse |
93
|
|
|
*/ |
94
|
|
View Code Duplication |
protected function handleBatch($schema, $operations, $debug = FALSE) { |
|
|
|
|
95
|
|
|
$result = $this->processor->processQuery($schema, $operations, NULL, $debug); |
96
|
|
|
$response = new CacheableJsonResponse($result); |
97
|
|
|
|
98
|
|
|
foreach ($result as $item) { |
|
|
|
|
99
|
|
|
$response->addCacheableDependency($result); |
100
|
|
|
} |
101
|
|
|
|
102
|
|
|
return $response; |
103
|
|
|
} |
104
|
|
|
} |
105
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.