public function compile() { foreach (PluginRepository::findAll() as $plugin) { $containerBuilder = new UnfreezableContainerBuilder(); $containerBuilder->registerExtension(new GeneralExtension()); $extensionClass = new \ReflectionClass('Stagehand\\TestRunner\\DependencyInjection\\Extension\\' . $plugin->getPluginID() . 'Extension'); if (!$extensionClass->isInterface() && !$extensionClass->isAbstract() && $extensionClass->isSubclassOf('Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface')) { $containerBuilder->registerExtension($extensionClass->newInstance()); } foreach ($containerBuilder->getExtensions() as $extension) { /* @var $extension \Symfony\Component\DependencyInjection\Extension\ExtensionInterface */ $containerBuilder->loadFromExtension($extension->getAlias(), array()); } $containerBuilder->addCompilerPass(new ReplaceDefinitionByPluginDefinitionPass($plugin)); $containerBuilder->getCompilerPassConfig()->setOptimizationPasses(array_filter($containerBuilder->getCompilerPassConfig()->getOptimizationPasses(), function (CompilerPassInterface $compilerPass) { return !$compilerPass instanceof ResolveParameterPlaceHoldersPass; })); ErrorReporting::invokeWith(error_reporting() & ~E_USER_DEPRECATED, function () use($containerBuilder) { $containerBuilder->compile(); }); $phpDumper = new PhpDumper($containerBuilder); $containerClass = $plugin->getPluginID() . 'Container'; $containerClassSource = $phpDumper->dump(array('class' => $containerClass)); $containerClassSource = preg_replace('/^<\\?php/', '<?php' . PHP_EOL . 'namespace ' . self::COMPILED_CONTAINER_NAMESPACE . ';' . PHP_EOL, $containerClassSource); file_put_contents(__DIR__ . '/../' . $containerClass . '.php', $containerClassSource); } }
/** * @return array * @throws \Stagehand\TestRunner\DependencyInjection\Extension\FrameworkUnavailableException */ public static function findAll() { $plugins = PluginRepository::findAll(); if (count($plugins) == 0) { throw new FrameworkUnavailableException('Stagehand_TestRunner is unavailable since no plugins are found in this installation.'); } $extensions = array(new GeneralExtension()); foreach ($plugins as $plugin) { /* @var $plugin \Stagehand\TestRunner\Core\Plugin\IPlugin */ $extensionClass = new \ReflectionClass(__NAMESPACE__ . '\\' . $plugin->getPluginID() . 'Extension'); if (!$extensionClass->isInterface() && !$extensionClass->isAbstract() && $extensionClass->isSubclassOf('Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface')) { $extensions[] = $extensionClass->newInstance(); } } return $extensions; }
public function compile() { foreach (PluginRepository::findAll() as $plugin) { $containerBuilder = new UnfreezableContainerBuilder(); $containerBuilder->registerExtension(new GeneralExtension()); $extensionClass = new \ReflectionClass('Stagehand\\TestRunner\\DependencyInjection\\Extension\\' . $plugin->getPluginID() . 'Extension'); if (!$extensionClass->isInterface() && !$extensionClass->isAbstract() && $extensionClass->isSubclassOf('Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface')) { $containerBuilder->registerExtension($extensionClass->newInstance()); } foreach ($containerBuilder->getExtensions() as $extension) { /* @var $extension \Symfony\Component\DependencyInjection\Extension\ExtensionInterface */ $containerBuilder->loadFromExtension($extension->getAlias(), array()); } $containerBuilder->addCompilerPass(new ReplaceDefinitionByPluginDefinitionPass($plugin)); $containerBuilder->getCompilerPassConfig()->setOptimizationPasses(array_filter($containerBuilder->getCompilerPassConfig()->getOptimizationPasses(), function (CompilerPassInterface $compilerPass) { return !$compilerPass instanceof ResolveParameterPlaceHoldersPass; })); $containerClass = $plugin->getPluginID() . 'Container'; $compiler = new \Stagehand\ComponentFactory\Compiler($containerBuilder, $containerClass, self::COMPILED_CONTAINER_NAMESPACE); $containerSource = $compiler->compile(); file_put_contents(__DIR__ . '/../' . $containerClass . '.php', $containerSource); } }