We could not synchronize checks via GitHub's checks API since Scrutinizer's GitHub App is not installed for this repository.
1 | <?php |
||
18 | class AutoMappingPass implements CompilerPassInterface |
||
19 | { |
||
20 | private static $serviceSubclassTagMapping = [ |
||
21 | MutationInterface::class => 'overblog_graphql.mutation', |
||
22 | ResolverInterface::class => 'overblog_graphql.resolver', |
||
23 | Type::class => 'overblog_graphql.type', |
||
24 | ]; |
||
25 | |||
26 | 10 | public function process(ContainerBuilder $container) |
|
27 | { |
||
28 | 10 | $enabled = $container->getParameter('overblog_graphql.auto_mapping.enabled'); |
|
29 | // enabled auto mapping for all bundles and custom dirs ? |
||
30 | 10 | if ($enabled) { |
|
31 | $directories = $container->getParameter('overblog_graphql.auto_mapping.directories'); |
||
32 | $bundles = $container->getParameter('kernel.bundles'); |
||
33 | $directories = array_merge( |
||
34 | array_map( |
||
35 | function ($class) { |
||
36 | $bundleDir = $this->bundleDir($class); |
||
37 | |||
38 | return $bundleDir.'/GraphQL'; |
||
39 | }, |
||
40 | $bundles |
||
41 | ), |
||
42 | $directories |
||
43 | ); |
||
44 | // add app dir |
||
45 | if ($container->hasParameter('kernel.root_dir')) { |
||
46 | $directories[] = $container->getParameter('kernel.root_dir').'/GraphQL'; |
||
47 | } |
||
48 | } else { |
||
49 | // enabled auto mapping only for this bundle |
||
50 | 10 | $directories = [$this->bundleDir(OverblogGraphQLBundle::class).'/GraphQL']; |
|
51 | } |
||
52 | 10 | $directoryList = []; |
|
53 | |||
54 | 10 | foreach ($directories as $directory) { |
|
55 | 10 | list($reflectionClasses, $directories) = $this->reflectionClassesFromDirectory($directory); |
|
56 | 10 | $directoryList = array_merge($directoryList, $directories); |
|
57 | 10 | $this->addServicesDefinitions($container, $reflectionClasses); |
|
58 | } |
||
59 | |||
60 | 10 | foreach ($directoryList as $directory => $v) { |
|
61 | 10 | $directory = realpath($directory); |
|
62 | 10 | $container->addResource(new DirectoryResource($directory, '/\.php$/')); |
|
63 | } |
||
64 | 10 | } |
|
65 | |||
66 | /** |
||
67 | * @param ContainerBuilder $container |
||
68 | * @param \ReflectionClass[] $reflectionClasses |
||
69 | */ |
||
70 | 10 | private function addServicesDefinitions(ContainerBuilder $container, array $reflectionClasses) |
|
76 | |||
77 | 10 | private function addServiceDefinition(ContainerBuilder $container, \ReflectionClass $reflectionClass) |
|
78 | { |
||
79 | 10 | $className = $reflectionClass->getName(); |
|
|
|||
80 | 10 | $definition = $container->setDefinition($className, new Definition($className)); |
|
81 | 10 | $definition->setPublic(false); |
|
82 | 10 | $definition->setAutowired(true); |
|
83 | 10 | if (is_subclass_of($definition->getClass(), ContainerAwareInterface::class)) { |
|
84 | $definition->addMethodCall('setContainer', [new Reference('service_container')]); |
||
85 | } |
||
86 | 10 | $this->addDefinitionTags($definition, $reflectionClass); |
|
87 | 10 | } |
|
88 | |||
89 | 10 | private function addDefinitionTags(Definition $definition, \ReflectionClass $reflectionClass) |
|
90 | { |
||
91 | 10 | $className = $definition->getClass(); |
|
92 | |||
93 | 10 | foreach (self::$serviceSubclassTagMapping as $subclass => $tagName) { |
|
94 | 10 | if (!$reflectionClass->isSubclassOf($subclass)) { |
|
95 | 10 | continue; |
|
96 | } |
||
97 | |||
98 | 10 | if (Type::class !== $subclass) { |
|
99 | 10 | $publicReflectionMethods = $reflectionClass->getMethods(\ReflectionMethod::IS_PUBLIC); |
|
100 | 10 | $isAliased = $reflectionClass->implementsInterface(AliasedInterface::class); |
|
101 | 10 | foreach ($publicReflectionMethods as $publicReflectionMethod) { |
|
102 | 10 | if ('__construct' === $publicReflectionMethod->name || $isAliased && 'getAliases' === $publicReflectionMethod->name) { |
|
103 | 10 | continue; |
|
104 | } |
||
105 | 10 | $definition->addTag($tagName, ['method' => $publicReflectionMethod->name]); |
|
106 | } |
||
107 | 10 | if ($isAliased) { |
|
108 | 10 | $this->addDefinitionTagsFromAliasesMethod($definition, $className, $tagName, true); |
|
109 | } |
||
110 | } else { |
||
111 | $definition->addTag($tagName); |
||
112 | 10 | $this->addDefinitionTagsFromAliasesMethod($definition, $className, $tagName, false); |
|
113 | } |
||
114 | } |
||
115 | 10 | } |
|
116 | |||
117 | 10 | private function addDefinitionTagsFromAliasesMethod(Definition $definition, $className, $tagName, $withMethod) |
|
118 | { |
||
119 | // from getAliases |
||
120 | 10 | if (!is_callable([$className, 'getAliases'])) { |
|
121 | return; |
||
122 | } |
||
123 | 10 | $aliases = call_user_func([$className, 'getAliases']); |
|
124 | |||
125 | 10 | foreach ($aliases as $key => $alias) { |
|
126 | 10 | $definition->addTag($tagName, $withMethod ? ['alias' => $alias, 'method' => $key] : ['alias' => $alias]); |
|
127 | } |
||
128 | 10 | } |
|
129 | |||
130 | 10 | private function subclass($class) |
|
142 | |||
143 | /** |
||
144 | * Gets the classes reflection of class in the given directory. |
||
145 | * |
||
146 | * @param string $directory |
||
147 | * |
||
148 | * @return array |
||
149 | */ |
||
150 | 10 | private function reflectionClassesFromDirectory($directory) |
|
151 | { |
||
152 | 10 | $classes = []; |
|
153 | 10 | $directoryList = []; |
|
154 | 10 | $includedFiles = []; |
|
155 | 10 | $reflectionClasses = []; |
|
156 | |||
157 | 10 | $finder = new Finder(); |
|
158 | try { |
||
159 | 10 | $finder->in($directory)->files()->name('*.php'); |
|
160 | } catch (\InvalidArgumentException $e) { |
||
161 | return [$reflectionClasses, $directoryList]; |
||
162 | } |
||
163 | |||
164 | 10 | foreach ($finder as $file) { |
|
165 | 10 | $directoryList[$file->getPath()] = true; |
|
166 | 10 | $sourceFile = $file->getRealpath(); |
|
167 | 10 | if (!preg_match('(^phar:)i', $sourceFile)) { |
|
168 | 10 | $sourceFile = realpath($sourceFile); |
|
169 | } |
||
170 | |||
171 | 10 | require_once $sourceFile; |
|
172 | 10 | $includedFiles[$sourceFile] = true; |
|
173 | } |
||
174 | |||
175 | 10 | $declared = get_declared_classes(); |
|
176 | 10 | foreach ($declared as $className) { |
|
177 | 10 | $subclass = $this->subclass($className); |
|
178 | 10 | if (false === $subclass) { |
|
179 | 10 | continue; |
|
180 | } |
||
181 | 10 | $reflectionClass = new \ReflectionClass($className); |
|
182 | 10 | $reflectionClasses[$className] = $reflectionClass; |
|
183 | 10 | $sourceFile = $reflectionClass->getFileName(); |
|
184 | |||
185 | 10 | if ($reflectionClass->isAbstract()) { |
|
186 | 10 | continue; |
|
187 | } |
||
188 | |||
189 | 10 | if (isset($includedFiles[$sourceFile])) { |
|
190 | 10 | $classes[$className] = true; |
|
191 | } |
||
192 | } |
||
193 | |||
194 | 10 | return [array_intersect_key($reflectionClasses, $classes), $directoryList]; |
|
195 | } |
||
196 | |||
197 | 10 | private function bundleDir($bundleClass) |
|
204 | } |
||
205 |