public function register(Application $app)
{
$app['assetic.options'] = [];
/**
* Asset Factory configuration happens here
*/
$app['assetic'] = $app->share(function () use($app) {
$app['assetic.options'] = array_replace(array('debug' => false, 'formulae_cache_dir' => $app['paths.cache'] . '/assetic'), $app['assetic.options']);
return $app['assetic.factory'];
});
$app['paths.cache_assets'] = $app['paths.cache'] . '/assets';
/**
* Asset manager
*
* @return \Assetic\AssetManager
*/
$app['assetic.asset_manager'] = $app->share(function () {
return new AssetManager();
});
$app['assetic.filters.uglifyjs2'] = $app->share(function () {
return new UglifyJs2Filter();
});
$app['assetic.filters.uglifycss'] = $app->share(function () {
return new UglifyCssFilter();
});
$app['assetic.filters.compass'] = $app->share(function () use($app) {
$filter = new CompassFilter();
$filter->setCacheLocation($app['paths.cache'] . '/compass');
$filter->addLoadPath($app['paths.sentient'] . '/Resource/scss');
return $filter;
});
/**
* Filter manager
*
* @return \Assetic\FilterManager
*/
$app['assetic.filter_manager'] = $app->share(function () use($app) {
$manager = new FilterManager();
$manager->set('uglifyjs', $app['assetic.filters.uglifyjs2']);
$manager->set('uglifycss', $app['assetic.filters.uglifycss']);
$manager->set('compass', $app['assetic.filters.compass']);
return $manager;
});
/**
* Asset writer, writes to the 'assetic.path_to_web' folder
*
* @return \Assetic\AssetWriter
*/
$app['assetic.asset_writer'] = $app->share(function () use($app) {
return new AssetWriter($app['paths.cache_assets']);
});
/**
* Factory
*
* @return \Assetic\Factory\AssetFactory
*/
$app['assetic.factory'] = $app->share(function () use($app) {
$factory = new AssetFactory($app['paths.resources'], false);
$factory->setAssetManager($app['assetic.asset_manager']);
$factory->setFilterManager($app['assetic.filter_manager']);
$factory->addPath('sentient', $app['paths.templates'] . '/sentient');
$factory->addPath('sentient', $app['paths.sentient'] . '/Resource');
foreach ($app->getPluginNames() as $name) {
$factory->addPath($name, $app['paths.resources'] . '/plugin/' . $name);
$factory->addPath($name, $app->getPlugin($name)->getPath() . '/Resource');
}
return $factory;
});
/**
* Asset controllers
*/
$app['assets.controllers'] = $app->share(function () use($app) {
$controllers = $app['controllers_factory'];
$controllers->match('/{filename}', function (Request $request) use($app) {
return new AssetResponse($request->get('asset'), $app['assetic.asset_writer'], $app['paths.cache_assets']);
})->assert('filename', '.+')->beforeMatch(function (array $attrs) use($app) {
// @todo: A better way than looping through all loaded assets
foreach ($app['assetic.asset_manager']->getNames() as $name) {
$asset = $app['assetic.asset_manager']->get($name);
if ($asset->getTargetPath() === $attrs['filename']) {
$attrs['asset'] = $asset;
return $attrs;
}
}
return false;
})->bind('asset');
return $controllers;
});
$app['assets.register_js'] = $app->protect(function ($name, $scripts) use($app) {
$asset = $app['assetic.factory']->createAsset((array) $scripts, ['uglifyjs'], ['output' => 'js/' . $name . '.js']);
$app['assetic.asset_manager']->set('js_' . str_replace('/', '_', $name), $asset);
return $asset;
});
$app['assets.register_scss'] = $app->protect(function ($name, $stylesheets) use($app) {
$asset = $app['assetic.factory']->createAsset((array) $stylesheets, ['compass', 'uglifycss'], ['output' => 'css/' . $name . '.css']);
$app['assetic.asset_manager']->set('css_' . str_replace('/', '_', $name), $asset);
return $asset;
});
$app['asset_helper'] = $app->share(function () use($app) {
return new AssetHelper($app['assetic.asset_manager'], $app['url_generator']);
});
$app['twig'] = $app->share($app->extend('twig', function (\Twig_Environment $twig) use($app) {
$twig->addExtension(new TwigAssetExtension($app['asset_helper']));
return $twig;
}));
$app['filesystem_controllers_factory'] = $app->protect(function ($basePath, $routeName = null) use($app) {
$controllers = $app['controllers_factory'];
$route = $controllers->match('/{filename}', function (Request $request) {
$file = new FilesystemFile($request->get('path'));
return new FileResponse($file);
})->beforeMatch(function (array $attrs) use($basePath) {
if (false !== strpos($attrs['filename'], '..')) {
return false;
}
$attrs['path'] = $basePath . '/' . $attrs['filename'];
if (!is_file($attrs['path'])) {
return false;
}
return $attrs;
})->assert('filename', '.+');
if ($routeName !== null) {
$route->bind($routeName);
}
return $controllers;
});
$app->mount('/assets', $app['assets.controllers']);
}