Example #1
0
 /**
  * Compiles scoped proxy types and saves them on the filesystem.
  * 
  * @param ContainerBuilder $builder
  * @param string $proxyCachePath
  * @param array<stribg> $additionalProxies
  * @return string
  */
 protected function compileScopedProxies(ContainerBuilder $builder, $proxyCachePath, array $additionalProxies = [])
 {
     $code = "\t\tpublic function loadScopedProxy(\$typeName) {\n";
     $code .= "\t\tswitch(\$typeName) {\n";
     $proxyTypes = [];
     foreach ($builder->getProxyBindings() as $binding) {
         $ref = new \ReflectionClass($binding->getTypeName());
         $proxyTypes[$ref->name] = $ref;
     }
     foreach ($additionalProxies as $add) {
         $ref = new \ReflectionClass($add);
         $proxyTypes[$ref->name] = $ref;
     }
     foreach ($proxyTypes as $ref) {
         $parent = $ref;
         $mtime = filemtime($ref->getFileName());
         while ($parent = $ref->getParentClass()) {
             $mtime = max($mtime, filemtime($parent->getFileName()));
         }
         $file = $proxyCachePath . '/' . md5(strtolower($ref->name)) . '.php';
         $create = !is_file($file) || filemtime($file) < $mtime;
         if ($create) {
             $proxyCode = '<?php' . "\n\n" . $this->proxyGenerator->generateProxyCode($ref);
             Filesystem::writeFile($file, $proxyCode);
         }
         $code .= "\t\t\tcase " . var_export($ref->name, true) . ":\n";
         $code .= "\t\t\t\trequire_once " . var_export($file, true) . ";\n";
         $code .= "\t\t\t\treturn \$typeName . '__scoped';\n";
         $code .= "\t\t\t\tbreak;\n";
     }
     $code .= "\t\t}\n";
     $code .= "\t\treturn parent::loadScopedProxy(\$typeName);\n";
     $code .= "\t\t}\n\n";
     return $code;
 }