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 0a8d09846f..f75c019e99 100644
--- a/src/Symfony/Bundle/TwigBundle/composer.json
+++ b/src/Symfony/Bundle/TwigBundle/composer.json
@@ -27,6 +27,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",