123 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
/*
 | 
						|
 * This file is part of the Symfony framework.
 | 
						|
 *
 | 
						|
 * (c) Fabien Potencier <fabien@symfony.com>
 | 
						|
 *
 | 
						|
 * 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 <kris@symfony.com>
 | 
						|
 */
 | 
						|
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;
 | 
						|
    }
 | 
						|
}
 |