77use Overblog \GraphQLBundle \Definition \Argument ;
88use Overblog \GraphQLBundle \Error \UserWarning ;
99use Overblog \GraphQLGenerator \Generator \TypeGenerator as BaseTypeGenerator ;
10+ use Symfony \Component \ExpressionLanguage \Expression ;
1011use Symfony \Component \Filesystem \Filesystem ;
1112
1213class TypeGenerator extends BaseTypeGenerator
@@ -17,12 +18,18 @@ class TypeGenerator extends BaseTypeGenerator
1718
1819 private $ defaultResolver ;
1920
21+ private $ configs ;
22+
23+ private $ useClassMap = true ;
24+
2025 private static $ classMapLoaded = false ;
2126
22- public function __construct ($ classNamespace , array $ skeletonDirs , $ cacheDir , callable $ defaultResolver )
27+ public function __construct ($ classNamespace , array $ skeletonDirs , $ cacheDir , callable $ defaultResolver, array $ configs , $ useClassMap = true )
2328 {
2429 $ this ->setCacheDir ($ cacheDir );
2530 $ this ->defaultResolver = $ defaultResolver ;
31+ $ this ->configs = $ this ->processConfigs ($ configs );
32+ $ this ->useClassMap = $ useClassMap ;
2633 parent ::__construct ($ classNamespace , $ skeletonDirs );
2734 }
2835
@@ -179,17 +186,17 @@ function ($childrenComplexity, $args = []) <closureUseStatements>{
179186 return $ code ;
180187 }
181188
182- public function compile (array $ configs , $ loadClasses = true )
189+ public function compile ($ mode )
183190 {
184191 $ cacheDir = $ this ->getCacheDir ();
185- if (file_exists ($ cacheDir )) {
192+ $ writeMode = $ mode & self ::MODE_WRITE ;
193+ if ($ writeMode && file_exists ($ cacheDir )) {
186194 $ fs = new Filesystem ();
187195 $ fs ->remove ($ cacheDir );
188196 }
197+ $ classes = $ this ->generateClasses ($ this ->configs , $ cacheDir , $ mode );
189198
190- $ classes = $ this ->generateClasses ($ configs , $ cacheDir , true );
191-
192- if ($ loadClasses ) {
199+ if ($ writeMode && $ this ->useClassMap ) {
193200 $ content = "<?php \nreturn " .var_export ($ classes , true ).'; ' ;
194201 // replaced hard-coding absolute path by __DIR__ (see https://github.com/overblog/GraphQLBundle/issues/167)
195202 $ content = str_replace (' => \'' .$ cacheDir , ' => __DIR__ . \'' , $ content );
@@ -204,8 +211,9 @@ public function compile(array $configs, $loadClasses = true)
204211
205212 public function loadClasses ($ forceReload = false )
206213 {
207- if (!self ::$ classMapLoaded || $ forceReload ) {
208- $ classes = require $ this ->getClassesMap ();
214+ if ($ this ->useClassMap && (!self ::$ classMapLoaded || $ forceReload )) {
215+ $ classMapFile = $ this ->getClassesMap ();
216+ $ classes = file_exists ($ classMapFile ) ? require $ classMapFile : [];
209217 /** @var ClassLoader $mapClassLoader */
210218 static $ mapClassLoader = null ;
211219 if (null === $ mapClassLoader ) {
@@ -225,4 +233,20 @@ private function getClassesMap()
225233 {
226234 return $ this ->getCacheDir ().'/__classes.map ' ;
227235 }
236+
237+ private function processConfigs (array $ configs )
238+ {
239+ return array_map (
240+ function ($ v ) {
241+ if (is_array ($ v )) {
242+ return call_user_func ([$ this , 'processConfigs ' ], $ v );
243+ } elseif (is_string ($ v ) && 0 === strpos ($ v , '@= ' )) {
244+ return new Expression (substr ($ v , 2 ));
245+ }
246+
247+ return $ v ;
248+ },
249+ $ configs
250+ );
251+ }
228252}
0 commit comments