* * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Symfony\Bundle\AsseticBundle\Routing; use Assetic\Asset\AssetInterface; use Assetic\Factory\LazyAssetManager; use Symfony\Bundle\AsseticBundle\Config\AsseticResource; use Symfony\Component\Config\Loader\Loader; use Symfony\Component\Config\Resource\FileResource; use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; /** * Loads routes for all assets. * * Assets should only be served through the routing system for ease-of-use * during development. * * For example, add the following to your application's routing_dev.yml: * * _assetic: * resource: . * type: assetic * * In a production environment you should use the `assetic:dump` command to * create static asset files. * * @author Kris Wallsmith */ class AsseticLoader extends Loader { protected $am; public function __construct(LazyAssetManager $am) { $this->am = $am; } public function load($routingResource, $type = null) { $routes = new RouteCollection(); // resources foreach ($this->am->getResources() as $resources) { if (!$resources instanceof \Traversable) { $resources = array($resources); } foreach ($resources as $resource) { $routes->addResource(new AsseticResource($resource)); } } // routes foreach ($this->am->getNames() as $name) { $asset = $this->am->get($name); $formula = $this->am->getFormula($name); $this->loadRouteForAsset($routes, $asset, $name); $debug = isset($formula[2]['debug']) ? $formula[2]['debug'] : $this->am->isDebug(); $combine = isset($formula[2]['combine']) ? $formula[2]['combine'] : !$debug; // add a route for each "leaf" in debug mode if (!$combine) { $i = 0; foreach ($asset as $leaf) { $this->loadRouteForAsset($routes, $leaf, $name, $i++); } } } return $routes; } /** * Loads a route to serve an supplied asset. * * The fake front controller that {@link UseControllerWorker} adds to the * target URL will be removed before set as a route pattern. * * @param RouteCollection $routes The route collection * @param AssetInterface $asset The asset * @param string $name The name to use * @param integer $pos The leaf index */ private function loadRouteForAsset(RouteCollection $routes, AssetInterface $asset, $name, $pos = null) { $defaults = array( '_controller' => 'assetic.controller:render', 'name' => $name, 'pos' => $pos, ); // remove the fake front controller $pattern = str_replace('_controller/', '', $asset->getTargetPath()); if ($format = pathinfo($pattern, PATHINFO_EXTENSION)) { $defaults['_format'] = $format; } $route = '_assetic_'.$name; if (null !== $pos) { $route .= '_'.$pos; } $routes->add($route, new Route($pattern, $defaults)); } public function supports($resource, $type = null) { return 'assetic' == $type; } }