[TwigBundle] Fix Twig cache is not properly warmed

This commit is contained in:
Tugdual Saunier 2015-10-16 14:20:03 +01:00
parent 619528a274
commit e704ee4d6c
6 changed files with 129 additions and 8 deletions

View File

@ -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) {

View File

@ -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());

View File

@ -46,8 +46,9 @@
</service>
<service id="twig.cache_warmer" class="%twig.cache_warmer.class%" public="false">
<tag name="kernel.cache_warmer" />
<argument type="service" id="service_container" />
<argument type="service" id="templating.finder" />
<argument type="service" id="templating.finder" on-invalid="ignore" />
</service>
<service id="twig.loader.native_filesystem" class="Twig_Loader_Filesystem" public="false">

View File

@ -0,0 +1,116 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* 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';
}
}

View File

@ -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",