diff --git a/src/Symfony/Component/HttpKernel/Kernel.php b/src/Symfony/Component/HttpKernel/Kernel.php index a6c31e8a3f821..8c70005d28577 100644 --- a/src/Symfony/Component/HttpKernel/Kernel.php +++ b/src/Symfony/Component/HttpKernel/Kernel.php @@ -584,6 +584,11 @@ protected function initializeContainer() file_put_contents($this->getCacheDir().'/'.$class.'Compiler.log', null !== $container ? implode("\n", $container->getCompiler()->getLog()) : ''); } } + + if ($oldContainer = file_exists($cache->getPath()) ? @include $cache->getPath() : false) { + $oldContainer = new \ReflectionClass($oldContainer); + } + $this->dumpContainer($cache, $container, $class, $this->getContainerBaseClass()); $fresh = false; @@ -592,7 +597,15 @@ protected function initializeContainer() $this->container = require $cache->getPath(); $this->container->set('kernel', $this); - if (!$fresh && $this->container->has('cache_warmer')) { + if ($fresh) { + return; + } + + if ($oldContainer && get_class($this->container) !== $oldContainer->name) { + (new Filesystem())->remove(dirname($oldContainer->getFileName())); + } + + if ($this->container->has('cache_warmer')) { $this->container->get('cache_warmer')->warmUp($this->container->getParameter('kernel.cache_dir')); } } @@ -773,6 +786,9 @@ protected function dumpContainer(ConfigCache $cache, ContainerBuilder $container @chmod($dir.$file, 0666 & ~umask()); } + // track changes made to the container directory + $container->fileExists(dirname($dir.$file)); + $cache->write($rootCode, $container->getResources()); } diff --git a/src/Symfony/Component/HttpKernel/Tests/KernelTest.php b/src/Symfony/Component/HttpKernel/Tests/KernelTest.php index 052e5766d6c7c..4392e30e652f3 100644 --- a/src/Symfony/Component/HttpKernel/Tests/KernelTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/KernelTest.php @@ -771,13 +771,38 @@ public function testSymfonyEnvironmentVariables() public function testProjectDirExtension() { - $kernel = new CustomProjectDirKernel('test', true); + $kernel = new CustomProjectDirKernel(); $kernel->boot(); $this->assertSame('foo', $kernel->getProjectDir()); $this->assertSame('foo', $kernel->getContainer()->getParameter('kernel.project_dir')); } + public function testKernelReset() + { + (new Filesystem())->remove(__DIR__.'/Fixtures/cache'); + + $kernel = new CustomProjectDirKernel(); + $kernel->boot(); + + $containerClass = get_class($kernel->getContainer()); + $containerFile = (new \ReflectionClass($kernel->getContainer()))->getFileName(); + unlink(__DIR__.'/Fixtures/cache/custom/FixturesCustomDebugProjectContainer.php.meta'); + + $kernel = new CustomProjectDirKernel(); + $kernel->boot(); + + $this->assertSame($containerClass, get_class($kernel->getContainer())); + $this->assertFileExists($containerFile); + unlink(__DIR__.'/Fixtures/cache/custom/FixturesCustomDebugProjectContainer.php.meta'); + + $kernel = new CustomProjectDirKernel(function ($container) { $container->register('foo', 'stdClass'); }); + $kernel->boot(); + + $this->assertTrue(get_class($kernel->getContainer()) !== $containerClass); + $this->assertFileNotExists($containerFile); + } + /** * Returns a mock for the BundleInterface. * @@ -878,12 +903,14 @@ public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = class CustomProjectDirKernel extends Kernel { private $baseDir; + private $buildContainer; - public function __construct() + public function __construct(\Closure $buildContainer = null) { - parent::__construct('test', false); + parent::__construct('custom', true); $this->baseDir = 'foo'; + $this->buildContainer = $buildContainer; } public function registerBundles() @@ -904,4 +931,11 @@ public function getRootDir() { return __DIR__.'/Fixtures'; } + + protected function build(ContainerBuilder $container) + { + if ($build = $this->buildContainer) { + $build($container); + } + } }