[HttpKernel][DI] Enable Kernel to implement CompilerPassInterface

This commit is contained in:
Nicolas Grekas 2017-09-19 12:45:06 +02:00
parent aad62c427c
commit 6973a1ae3b
6 changed files with 33 additions and 1 deletions

View File

@ -184,6 +184,8 @@ DependencyInjection
* Top-level anonymous services in XML are no longer supported. * Top-level anonymous services in XML are no longer supported.
* The `ExtensionCompilerPass` has been moved to before-optimization passes with priority -1000.
EventDispatcher EventDispatcher
--------------- ---------------

View File

@ -4,6 +4,7 @@ CHANGELOG
3.4.0 3.4.0
----- -----
* moved the `ExtensionCompilerPass` to before-optimization passes with priority -1000
* deprecated "public-by-default" definitions and aliases, the new default will be "private" in 4.0 * deprecated "public-by-default" definitions and aliases, the new default will be "private" in 4.0
* added `EnvVarProcessorInterface` and corresponding "container.env_var_processor" tag for processing env vars * added `EnvVarProcessorInterface` and corresponding "container.env_var_processor" tag for processing env vars
* added support for ignore-on-uninitialized references * added support for ignore-on-uninitialized references

View File

@ -45,10 +45,10 @@ class PassConfig
new ResolveInstanceofConditionalsPass(), new ResolveInstanceofConditionalsPass(),
new RegisterEnvVarProcessorsPass(), new RegisterEnvVarProcessorsPass(),
), ),
-1000 => array(new ExtensionCompilerPass()),
); );
$this->optimizationPasses = array(array( $this->optimizationPasses = array(array(
new ExtensionCompilerPass(),
new ResolveChildDefinitionsPass(), new ResolveChildDefinitionsPass(),
new ServiceLocatorTagPass(), new ServiceLocatorTagPass(),
new DecoratorServicePass(), new DecoratorServicePass(),

View File

@ -4,6 +4,7 @@ CHANGELOG
3.4.0 3.4.0
----- -----
* made kernels implementing `CompilerPassInterface` able to process the container
* deprecated bundle inheritance * deprecated bundle inheritance
* added `RebootableInterface` and implemented it in `Kernel` * added `RebootableInterface` and implemented it in `Kernel`
* deprecated commands auto registration * deprecated commands auto registration

View File

@ -13,6 +13,8 @@ namespace Symfony\Component\HttpKernel;
use Symfony\Bridge\ProxyManager\LazyProxy\Instantiator\RuntimeInstantiator; use Symfony\Bridge\ProxyManager\LazyProxy\Instantiator\RuntimeInstantiator;
use Symfony\Bridge\ProxyManager\LazyProxy\PhpDumper\ProxyDumper; use Symfony\Bridge\ProxyManager\LazyProxy\PhpDumper\ProxyDumper;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\Compiler\PassConfig;
use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Dumper\PhpDumper; use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
@ -767,6 +769,9 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl
$container = new ContainerBuilder(); $container = new ContainerBuilder();
$container->getParameterBag()->add($this->getKernelParameters()); $container->getParameterBag()->add($this->getKernelParameters());
if ($this instanceof CompilerPassInterface) {
$container->addCompilerPass($this, PassConfig::TYPE_BEFORE_OPTIMIZATION, -10000);
}
if (class_exists('ProxyManager\Configuration') && class_exists('Symfony\Bridge\ProxyManager\LazyProxy\Instantiator\RuntimeInstantiator')) { if (class_exists('ProxyManager\Configuration') && class_exists('Symfony\Bridge\ProxyManager\LazyProxy\Instantiator\RuntimeInstantiator')) {
$container->setProxyInstantiator(new RuntimeInstantiator()); $container->setProxyInstantiator(new RuntimeInstantiator());
} }

View File

@ -13,6 +13,7 @@ namespace Symfony\Component\HttpKernel\Tests;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpKernel\Bundle\BundleInterface; use Symfony\Component\HttpKernel\Bundle\BundleInterface;
@ -831,6 +832,14 @@ EOF;
$this->assertFileNotExists($containerFile); $this->assertFileNotExists($containerFile);
} }
public function testKernelPass()
{
$kernel = new PassKernel();
$kernel->boot();
$this->assertTrue($kernel->getContainer()->getParameter('test.processed'));
}
/** /**
* Returns a mock for the BundleInterface. * Returns a mock for the BundleInterface.
* *
@ -967,3 +976,17 @@ class CustomProjectDirKernel extends Kernel
} }
} }
} }
class PassKernel extends CustomProjectDirKernel implements CompilerPassInterface
{
public function __construct(\Closure $buildContainer = null)
{
parent::__construct();
Kernel::__construct('pass', true);
}
public function process(ContainerBuilder $container)
{
$container->setParameter('test.processed', true);
}
}