From 05055d443c82bd0206aed396a205df56ae6e8e05 Mon Sep 17 00:00:00 2001 From: Kris Wallsmith Date: Thu, 24 Feb 2011 14:43:05 -0800 Subject: [PATCH 1/2] [AsseticBundle] fixed formula caching system --- .../DependencyInjection/AsseticExtension.php | 3 +- .../Factory/DirectoryResource.php | 31 +++++------ .../Factory/DirectoryResourceIterator.php | 45 ++++++++++++++++ .../AsseticBundle/Factory/FileResource.php | 52 +++++++++++++++++-- .../Resources/config/templating_php.xml | 1 + .../Resources/config/templating_twig.xml | 1 + 6 files changed, 111 insertions(+), 22 deletions(-) create mode 100644 src/Symfony/Bundle/AsseticBundle/Factory/DirectoryResourceIterator.php diff --git a/src/Symfony/Bundle/AsseticBundle/DependencyInjection/AsseticExtension.php b/src/Symfony/Bundle/AsseticBundle/DependencyInjection/AsseticExtension.php index dec34dec0574e..75e253b3f60d1 100644 --- a/src/Symfony/Bundle/AsseticBundle/DependencyInjection/AsseticExtension.php +++ b/src/Symfony/Bundle/AsseticBundle/DependencyInjection/AsseticExtension.php @@ -135,11 +135,10 @@ protected function createDirectoryResourceDefinition($bundle, $dir, $engine) $definition = new Definition('%assetic.directory_resource.class%'); $definition - ->addArgument(new Reference('templating.name_parser')) ->addArgument(new Reference('templating.loader')) ->addArgument($bundle) ->addArgument($dir) - ->addArgument('/\.'.$engine.'$/') + ->addArgument('/^[^.]+\.[^.]+\.'.$engine.'$/') ->addTag('assetic.templating.'.$engine) ->addTag('assetic.formula_resource', array('loader' => $engine)) ->setPublic(false) diff --git a/src/Symfony/Bundle/AsseticBundle/Factory/DirectoryResource.php b/src/Symfony/Bundle/AsseticBundle/Factory/DirectoryResource.php index 33740a36518c2..72b1ee68f880d 100644 --- a/src/Symfony/Bundle/AsseticBundle/Factory/DirectoryResource.php +++ b/src/Symfony/Bundle/AsseticBundle/Factory/DirectoryResource.php @@ -12,37 +12,38 @@ namespace Symfony\Bundle\AsseticBundle\Factory; use Assetic\Factory\Resource\DirectoryResource as BaseDirectoryResource; -use Symfony\Bundle\FrameworkBundle\Templating\TemplateNameParser; use Symfony\Component\Templating\Loader\LoaderInterface; /** - * A directory resource that creates Symfony2 resources. + * A directory resource that creates Symfony2 templating resources. * * @author Kris Wallsmith */ class DirectoryResource extends BaseDirectoryResource { - protected $parser; protected $loader; protected $bundle; - protected $baseDirLength; - - public function __construct(TemplateNameParser $parser, LoaderInterface $loader, $bundle, $baseDir, $pattern = null) + protected $path; + + /** + * Constructor. + * + * @param LoaderInterface $loader The templating loader + * @param string $bundle The current bundle name + * @param string $path The directory path + * @param string $pattern A regex pattern for file basenames + */ + public function __construct(LoaderInterface $loader, $bundle, $path, $pattern = null) { - $this->parser = $parser; $this->loader = $loader; $this->bundle = $bundle; + $this->path = rtrim($path, '/').'/'; - $this->baseDirLength = strlen(rtrim($baseDir, '/')) + 1; - - parent::__construct($baseDir, $pattern); + parent::__construct($path, $pattern); } - protected function createResource($path) + public function getIterator() { - $template = $this->parser->parseFromFilename(substr($path, $this->baseDirLength)); - $template->set('bundle', $this->bundle); - - return new FileResource($this->loader, $template); + return new DirectoryResourceIterator($this->loader, $this->bundle, $this->path, $this->getInnerIterator()); } } diff --git a/src/Symfony/Bundle/AsseticBundle/Factory/DirectoryResourceIterator.php b/src/Symfony/Bundle/AsseticBundle/Factory/DirectoryResourceIterator.php new file mode 100644 index 0000000000000..635a9b115b8d8 --- /dev/null +++ b/src/Symfony/Bundle/AsseticBundle/Factory/DirectoryResourceIterator.php @@ -0,0 +1,45 @@ + + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace Symfony\Bundle\AsseticBundle\Factory; + +use Symfony\Component\Templating\Loader\LoaderInterface; + +class DirectoryResourceIterator extends \RecursiveIteratorIterator +{ + protected $loader; + protected $bundle; + protected $path; + + /** + * Constructor. + * + * @param LoaderInterface $loader The templating loader + * @param string $bundle The current bundle name + * @param string $path The directory + * @param RecursiveIterator $iterator The inner iterator + */ + public function __construct(LoaderInterface $loader, $bundle, $path, \RecursiveIterator $iterator) + { + $this->loader = $loader; + $this->bundle = $bundle; + $this->path = $path; + + parent::__construct($iterator); + } + + public function current() + { + $file = parent::current(); + + return new FileResource($this->loader, $this->bundle, $this->path, $file->getPathname()); + } +} diff --git a/src/Symfony/Bundle/AsseticBundle/Factory/FileResource.php b/src/Symfony/Bundle/AsseticBundle/Factory/FileResource.php index ef7d9fea9e452..5a11e798579e9 100644 --- a/src/Symfony/Bundle/AsseticBundle/Factory/FileResource.php +++ b/src/Symfony/Bundle/AsseticBundle/Factory/FileResource.php @@ -12,8 +12,8 @@ namespace Symfony\Bundle\AsseticBundle\Factory; use Assetic\Factory\Resource\ResourceInterface; +use Symfony\Bundle\FrameworkBundle\Templating\TemplateReference; use Symfony\Component\Templating\Loader\LoaderInterface; -use Symfony\Component\Templating\TemplateReferenceInterface; /** * A file resource. @@ -23,21 +23,63 @@ class FileResource implements ResourceInterface { protected $loader; + protected $parser; + protected $bundle; + protected $baseDir; + protected $path; + protected $template; - public function __construct(LoaderInterface $loader, TemplateReferenceInterface $template) + /** + * Constructor. + * + * @param LoaderInterface $loader The templating loader + * @param string $bundle The current bundle name + * @param string $baseDir The directory + * @param string $path The file path + */ + public function __construct(LoaderInterface $loader, $bundle, $baseDir, $path) { $this->loader = $loader; - $this->template = $template; + $this->bundle = $bundle; + $this->baseDir = $baseDir; + $this->path = $path; } public function isFresh($timestamp) { - return $this->loader->isFresh($this->template, $timestamp); + return $this->loader->isFresh($this->getTemplate(), $timestamp); } public function getContent() { - return $this->loader->load($this->template)->getContent(); + return $this->loader->load($this->getTemplate())->getContent(); + } + + protected function getTemplate() + { + if (null === $this->template) { + $this->template = self::createTemplateReference($this->bundle, substr($this->path, strlen($this->baseDir))); + } + + return $this->template; + } + + static private function createTemplateReference($bundle, $file) + { + $parts = explode('/', strtr($file, '\\', '/')); + $elements = explode('.', array_pop($parts)); + + return new TemplateReference($bundle, implode('/', $parts), $elements[0], $elements[1], $elements[2]); + } + + public function __sleep() + { + return array('path'); + } + + public function __wakeup() + { + throw new \Exception(__CLASS__.' cannot be unserialized.'); } } diff --git a/src/Symfony/Bundle/AsseticBundle/Resources/config/templating_php.xml b/src/Symfony/Bundle/AsseticBundle/Resources/config/templating_php.xml index d30d4beeff4ef..bfa800ed80a94 100644 --- a/src/Symfony/Bundle/AsseticBundle/Resources/config/templating_php.xml +++ b/src/Symfony/Bundle/AsseticBundle/Resources/config/templating_php.xml @@ -24,6 +24,7 @@ + %kernel.debug% diff --git a/src/Symfony/Bundle/AsseticBundle/Resources/config/templating_twig.xml b/src/Symfony/Bundle/AsseticBundle/Resources/config/templating_twig.xml index 00ffb0d656e1c..5a779112067e8 100644 --- a/src/Symfony/Bundle/AsseticBundle/Resources/config/templating_twig.xml +++ b/src/Symfony/Bundle/AsseticBundle/Resources/config/templating_twig.xml @@ -25,6 +25,7 @@ + %kernel.debug% From d4db5319c821c8769771567ff6ea2d208e3bcb28 Mon Sep 17 00:00:00 2001 From: Kris Wallsmith Date: Thu, 24 Feb 2011 20:00:15 -0800 Subject: [PATCH 2/2] [AsseticBundle] added resources to the routing loader now the router will be aware of any changes assetic is aware of --- .../AsseticBundle/Factory/FileResource.php | 9 +++++++-- .../AsseticBundle/Routing/AsseticLoader.php | 20 +++++++++++++++++-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Bundle/AsseticBundle/Factory/FileResource.php b/src/Symfony/Bundle/AsseticBundle/Factory/FileResource.php index 5a11e798579e9..df132bf0ea0b3 100644 --- a/src/Symfony/Bundle/AsseticBundle/Factory/FileResource.php +++ b/src/Symfony/Bundle/AsseticBundle/Factory/FileResource.php @@ -11,7 +11,7 @@ namespace Symfony\Bundle\AsseticBundle\Factory; -use Assetic\Factory\Resource\ResourceInterface; +use Assetic\Factory\Resource\FileResourceInterface; use Symfony\Bundle\FrameworkBundle\Templating\TemplateReference; use Symfony\Component\Templating\Loader\LoaderInterface; @@ -20,7 +20,7 @@ * * @author Kris Wallsmith */ -class FileResource implements ResourceInterface +class FileResource implements FileResourceInterface { protected $loader; protected $parser; @@ -56,6 +56,11 @@ public function getContent() return $this->loader->load($this->getTemplate())->getContent(); } + public function getPath() + { + return $this->path; + } + protected function getTemplate() { if (null === $this->template) { diff --git a/src/Symfony/Bundle/AsseticBundle/Routing/AsseticLoader.php b/src/Symfony/Bundle/AsseticBundle/Routing/AsseticLoader.php index 04852a166eb0e..a6fe726f8cfae 100644 --- a/src/Symfony/Bundle/AsseticBundle/Routing/AsseticLoader.php +++ b/src/Symfony/Bundle/AsseticBundle/Routing/AsseticLoader.php @@ -11,8 +11,10 @@ namespace Symfony\Bundle\AsseticBundle\Routing; -use Assetic\AssetManager; +use Assetic\Factory\LazyAssetManager; +use Assetic\Factory\Resource\FileResourceInterface; use Symfony\Component\Config\Loader\Loader; +use Symfony\Component\Config\Resource\FileResource; use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; @@ -37,7 +39,7 @@ class AsseticLoader extends Loader { protected $am; - public function __construct(AssetManager $am) + public function __construct(LazyAssetManager $am) { $this->am = $am; } @@ -45,6 +47,20 @@ public function __construct(AssetManager $am) public function load($resource, $type = null) { $routes = new RouteCollection(); + + // resources + foreach ($this->am->getResources() as $resource) { + if (!$resource instanceof \Traversable) { + $resource = array($resource); + } + foreach ($resource as $r) { + if ($r instanceof FileResourceInterface) { + $routes->addResource(new FileResource($r->getPath())); + } + } + } + + // routes foreach ($this->am->getNames() as $name) { $asset = $this->am->get($name);