From e704ee4d6c27ff1152cef585292724ac5572d92a Mon Sep 17 00:00:00 2001 From: Tugdual Saunier Date: Fri, 16 Oct 2015 14:20:03 +0100 Subject: [PATCH] [TwigBundle] Fix Twig cache is not properly warmed --- .../CacheWarmer/TemplateCacheCacheWarmer.php | 13 +- .../Compiler/ExtensionPass.php | 4 +- .../TwigBundle/Resources/config/twig.xml | 3 +- .../Tests/Functional/CacheWarmingTest.php | 116 ++++++++++++++++++ .../Resources/config/empty_routing.yml | 0 src/Symfony/Bundle/TwigBundle/composer.json | 1 + 6 files changed, 129 insertions(+), 8 deletions(-) create mode 100644 src/Symfony/Bundle/TwigBundle/Tests/Functional/CacheWarmingTest.php create mode 100644 src/Symfony/Bundle/TwigBundle/Tests/Functional/Resources/config/empty_routing.yml diff --git a/src/Symfony/Bundle/TwigBundle/CacheWarmer/TemplateCacheCacheWarmer.php b/src/Symfony/Bundle/TwigBundle/CacheWarmer/TemplateCacheCacheWarmer.php index 65827eba5a..8557a2f55a 100644 --- a/src/Symfony/Bundle/TwigBundle/CacheWarmer/TemplateCacheCacheWarmer.php +++ b/src/Symfony/Bundle/TwigBundle/CacheWarmer/TemplateCacheCacheWarmer.php @@ -31,15 +31,16 @@ class TemplateCacheCacheWarmer implements CacheWarmerInterface /** * Constructor. * - * @param ContainerInterface $container The dependency injection container - * @param TemplateFinderInterface $finder The template paths cache warmer + * @param ContainerInterface $container The dependency injection container + * @param TemplateFinderInterface|null $finder The template paths cache warmer */ - public function __construct(ContainerInterface $container, TemplateFinderInterface $finder) + public function __construct(ContainerInterface $container, TemplateFinderInterface $finder = null) { // We don't inject the Twig environment directly as it depends on the // template locator (via the loader) which might be a cached one. // The cached template locator is available once the TemplatePathsCacheWarmer - // has been warmed up + // has been warmed up. + // But it can also be null if templating has been disabled. $this->container = $container; $this->finder = $finder; } @@ -51,6 +52,10 @@ class TemplateCacheCacheWarmer implements CacheWarmerInterface */ public function warmUp($cacheDir) { + if (null === $this->finder) { + return; + } + $twig = $this->container->get('twig'); foreach ($this->finder->findAllTemplates() as $template) { diff --git a/src/Symfony/Bundle/TwigBundle/DependencyInjection/Compiler/ExtensionPass.php b/src/Symfony/Bundle/TwigBundle/DependencyInjection/Compiler/ExtensionPass.php index f4344c7434..8746998468 100644 --- a/src/Symfony/Bundle/TwigBundle/DependencyInjection/Compiler/ExtensionPass.php +++ b/src/Symfony/Bundle/TwigBundle/DependencyInjection/Compiler/ExtensionPass.php @@ -68,9 +68,7 @@ class ExtensionPass implements CompilerPassInterface $container->getDefinition('twig.extension.debug')->addTag('twig.extension'); } - if ($container->has('templating')) { - $container->getDefinition('twig.cache_warmer')->addTag('kernel.cache_warmer'); - } else { + if (!$container->has('templating')) { $loader = $container->getDefinition('twig.loader.native_filesystem'); $loader->addTag('twig.loader'); $loader->setMethodCalls($container->getDefinition('twig.loader.filesystem')->getMethodCalls()); diff --git a/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml b/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml index 9e1a117774..6a13980fcd 100644 --- a/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml +++ b/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml @@ -46,8 +46,9 @@ + - + diff --git a/src/Symfony/Bundle/TwigBundle/Tests/Functional/CacheWarmingTest.php b/src/Symfony/Bundle/TwigBundle/Tests/Functional/CacheWarmingTest.php new file mode 100644 index 0000000000..610bfa3b58 --- /dev/null +++ b/src/Symfony/Bundle/TwigBundle/Tests/Functional/CacheWarmingTest.php @@ -0,0 +1,116 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bundle\TwigBundle\Tests; + +use Symfony\Component\HttpKernel\Kernel; +use Symfony\Component\Config\Loader\LoaderInterface; +use Symfony\Component\Filesystem\Filesystem; +use Symfony\Bundle\FrameworkBundle\FrameworkBundle; +use Symfony\Bundle\TwigBundle\TwigBundle; + +class NewCacheWamingTest extends \PHPUnit_Framework_TestCase +{ + public function testCacheIsProperlyWarmedWhenTemplatingIsAvailable() + { + $kernel = new CacheWarmingKernel(true); + $kernel->boot(); + + $warmer = $kernel->getContainer()->get('cache_warmer'); + $warmer->enableOptionalWarmers(); + $warmer->warmUp($kernel->getCacheDir()); + + $this->assertTrue(file_exists($kernel->getCacheDir().'/twig')); + } + + public function testCacheIsNotWarmedWhenTemplatingIsDisabled() + { + $kernel = new CacheWarmingKernel(false); + $kernel->boot(); + + $warmer = $kernel->getContainer()->get('cache_warmer'); + $warmer->enableOptionalWarmers(); + $warmer->warmUp($kernel->getCacheDir()); + + $this->assertFalse(file_exists($kernel->getCacheDir().'/twig')); + } + + protected function setUp() + { + $this->deleteTempDir(); + } + + protected function tearDown() + { + $this->deleteTempDir(); + } + + private function deleteTempDir() + { + if (!file_exists($dir = sys_get_temp_dir().'/'.Kernel::VERSION.'/CacheWarmingKernel')) { + return; + } + + $fs = new Filesystem(); + $fs->remove($dir); + } +} + +class CacheWarmingKernel extends Kernel +{ + private $withTemplating; + + public function __construct($withTemplating) + { + $this->withTemplating = $withTemplating; + + parent::__construct('dev', true); + } + + public function getName() + { + return 'CacheWarming'; + } + + public function registerBundles() + { + return array(new FrameworkBundle(), new TwigBundle()); + } + + public function registerContainerConfiguration(LoaderInterface $loader) + { + $loader->load(function ($container) { + $container->loadFromExtension('framework', array( + 'secret' => '$ecret', + )); + }); + + if ($this->withTemplating) { + $loader->load(function ($container) { + $container->loadFromExtension('framework', array( + 'secret' => '$ecret', + 'templating' => array('engines' => array('twig')), + 'router' => array('resource' => '%kernel.root_dir%/Resources/config/empty_routing.yml'), + )); + }); + } + } + + public function getCacheDir() + { + return sys_get_temp_dir().'/'.Kernel::VERSION.'/CacheWarmingKernel/cache'; + } + + public function getLogDir() + { + return sys_get_temp_dir().'/'.Kernel::VERSION.'/CacheWarmingKernel/logs'; + } +} diff --git a/src/Symfony/Bundle/TwigBundle/Tests/Functional/Resources/config/empty_routing.yml b/src/Symfony/Bundle/TwigBundle/Tests/Functional/Resources/config/empty_routing.yml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/Symfony/Bundle/TwigBundle/composer.json b/src/Symfony/Bundle/TwigBundle/composer.json index b52e497b67..ccd3484c66 100644 --- a/src/Symfony/Bundle/TwigBundle/composer.json +++ b/src/Symfony/Bundle/TwigBundle/composer.json @@ -28,6 +28,7 @@ "symfony/dependency-injection": "~2.6,>=2.6.6", "symfony/expression-language": "~2.4", "symfony/config": "~2.2", + "symfony/finder": "~2.0,>=2.0.5", "symfony/routing": "~2.1", "symfony/templating": "~2.1", "symfony/yaml": "~2.3",