* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Bundle\FrameworkBundle\Templating\CacheWarmer; use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmer; use Symfony\Component\HttpKernel\KernelInterface; use Symfony\Component\Finder\Finder; /** * Computes the association between template names and their paths on the disk. * * @author Fabien Potencier */ class TemplatePathsCacheWarmer extends CacheWarmer { protected $kernel; protected $rootDir; /** * Constructor. * * @param KernelInterface $kernel A KernelInterface instance * @param string $rootDir The directory where global templates can be stored */ public function __construct(KernelInterface $kernel, $rootDir) { $this->kernel = $kernel; $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) { list($category, $template) = $this->parseTemplateName($file, $prefix.'/'); $name = sprintf('%s:%s:%s', $bundle->getName(), $category, $template); $resource = '@'.$bundle->getName().$prefix.'/'.$category.'/'.$template; $templates[$name] = $this->kernel->locateResource($resource, $this->rootDir); } } if (is_dir($this->rootDir)) { $finder = new Finder(); foreach ($finder->files()->followLinks()->in($this->rootDir) as $file) { list($category, $template) = $this->parseTemplateName($file, strtr($this->rootDir, '\\', '/').'/'); $templates[sprintf(':%s:%s', $category, $template)] = (string) $file; } } return $templates; } protected function parseTemplateName($file, $prefix) { $path = strtr($file->getPathname(), '\\', '/'); list(, $tmp) = explode($prefix, $path, 2); $parts = explode('/', strtr($tmp, '\\', '/')); $template = array_pop($parts); return array(implode('/', $parts), $template); } }