diff -r 000000000000 -r 7f95f8617b0b vendor/bundles/Symfony/Bundle/AsseticBundle/Controller/AsseticController.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Symfony/Bundle/AsseticBundle/Controller/AsseticController.php Sat Sep 24 15:40:41 2011 +0200 @@ -0,0 +1,95 @@ + + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace Symfony\Bundle\AsseticBundle\Controller; + +use Assetic\Asset\AssetCache; +use Assetic\Asset\AssetInterface; +use Assetic\Factory\LazyAssetManager; +use Assetic\Cache\CacheInterface; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; + +/** + * Serves assets. + * + * @author Kris Wallsmith + */ +class AsseticController +{ + protected $request; + protected $am; + protected $cache; + + public function __construct(Request $request, LazyAssetManager $am, CacheInterface $cache) + { + $this->request = $request; + $this->am = $am; + $this->cache = $cache; + } + + public function render($name, $pos = null) + { + if (!$this->am->has($name)) { + throw new NotFoundHttpException(sprintf('The "%s" asset could not be found.', $name)); + } + + $asset = $this->am->get($name); + if (null !== $pos && !$asset = $this->findAssetLeaf($asset, $pos)) { + throw new NotFoundHttpException(sprintf('The "%s" asset does not include a leaf at position %d.', $name, $pos)); + } + + $response = $this->createResponse(); + + // last-modified + if (null !== $lastModified = $asset->getLastModified()) { + $date = new \DateTime(); + $date->setTimestamp($lastModified); + $response->setLastModified($date); + } + + // etag + if ($this->am->hasFormula($name)) { + $formula = $this->am->getFormula($name); + $formula['last_modified'] = $lastModified; + $response->setETag(md5(serialize($formula))); + } + + if ($response->isNotModified($this->request)) { + return $response; + } + + $response->setContent($this->cachifyAsset($asset)->dump()); + + return $response; + } + + protected function createResponse() + { + return new Response(); + } + + protected function cachifyAsset(AssetInterface $asset) + { + return new AssetCache($asset, $this->cache); + } + + private function findAssetLeaf(\Traversable $asset, $pos) + { + $i = 0; + foreach ($asset as $leaf) { + if ($pos == $i++) { + return $leaf; + } + } + } +}