* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Bundle\FrameworkBundle\CacheWarmer; use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmer; use Symfony\Component\HttpKernel\KernelInterface; use Symfony\Component\Finder\Finder; use Symfony\Component\Config\FileLocatorInterface; use Symfony\Bundle\FrameworkBundle\Templating\Template; use Symfony\Bundle\FrameworkBundle\Templating\TemplateNameParser; /** * Computes the association between template names and their paths on the disk. * * @author Fabien Potencier */ class TemplatePathsCacheWarmer extends CacheWarmer { protected $locator; protected $kernel; protected $rootDir; protected $parser; /** * Constructor. * * @param KernelInterface $kernel A KernelInterface instance * @param FileLocatorInterface $locator A FileLocatorInterface instance * @param string $rootDir The directory where global templates can be stored */ public function __construct(KernelInterface $kernel, FileLocatorInterface $locator, $rootDir) { $this->kernel = $kernel; $this->locator = $locator; $this->rootDir = $rootDir; } /** * Warms up the cache. * * @param string $cacheDir The cache directory */ public function warmUp($cacheDir) { $templates = $this->computeTemplatePaths(); $this->writeCacheFile($cacheDir.'/templates.php', sprintf('kernel->getBundles() as $name => $bundle) { if (!is_dir($dir = $bundle->getPath().$prefix)) { continue; } $finder = new Finder(); foreach ($finder->files()->followLinks()->in($dir) as $file) { if (false !== $template = $this->parseTemplateName($file, $prefix.'/', $bundle->getName())) { $templates[$template->getSignature()] = $this->locator->locate($template->getPath(), $this->rootDir); } } } if (is_dir($this->rootDir)) { $finder = new Finder(); foreach ($finder->files()->followLinks()->in($this->rootDir) as $file) { if (false !== $template = $this->parseTemplateName($file, strtr($this->rootDir, '\\', '/').'/')) { $templates[$template->getSignature()] = $file->getRealPath(); } } } return $templates; } protected function parseTemplateName($file, $prefix, $bundle = '') { if (null === $this->parser) { $this->parser = $this->kernel->getContainer()->get('templating.name_parser'); } $prefix = strtr($prefix, '\\', '/'); $path = strtr($file->getPathname(), '\\', '/'); list(, $file) = explode($prefix, $path, 2); $template = $this->parser->parseFromFilename($file); if (false !== $template) { $template->set('bundle', $bundle); } return $template; } }