Assetic AssetFactory :: createAsset (массив $ input, ...) - $ input не принимает элементы \ Assetic \ Asset \ * - PullRequest
0 голосов
/ 15 марта 2012

У меня есть пара методов, которые объединяют множество CSS-ресурсов в один, минимизируют их и выгружают (кэшируют) в сгенерированное имя файла, например "/assetic/6bad22c.css".Я достигаю этого, используя следующее:

В настоящее время я использую AssetFactory

private static function getCssAssetFactory()
{
    $fm = new FilterManager();

    $fm->set('less', new Filter\LessphpFilter());
    $fm->set('import', new Filter\CssImportFilter());
    $fm->set('rewrite', new Filter\CssRewriteFilter());
    $fm->set('min', new Filter\CssMinFilter());

    $factory = new AssetFactory(self::getAssetBuildPath());
    $factory->setFilterManager($fm);

    return $factory;
}

и создаю Актив через

public static function dumpStylesheets()
{
    $asset = self::getCssAssetFactory()->createAsset
    (   self::$stylesheets
    ,   array
        (   'less' // Less CSS Compiler
        ,   'import' // Solves @imports
        ,   'rewrite' // Rewrites Base URLs when moving to another URL
        ,   'min' // Minifies the script
        )
    ,   array('output' => 'assetic/*.css')
    );
    $cache = self::getAssetCache($asset);
    self::getAssetWriter()->writeAsset($cache);
    return self::basePath().'/'.$asset->getTargetPath();
}

Вот методы, на которые ссылаются:

private static function getAssetWriter()
{
    if (is_null(self::$AssetWriter))
    {
        self::$AssetWriter = new AssetWriter(self::getAssetBuildPath());
    }
    return self::$AssetWriter;
}

private static function getAssetCache($asset)
{
    return new AssetCache
    (   $asset
    ,   new FilesystemCache(self::getAssetBuildPath().'/cache')
    );
}

Никакой магии здесь пока нет.Моя проблема в том, что массив self::$stylesheets, по определению 1014 *, просто содержит строки пути к активам.Но мне нужно , чтобы использовать настоящие Активные активы следующим образом:

self::$stylesheets = array
( new Asset\FileAsset('path/to/style.css')
, new Asset\StringAsset('.some-class {text-decoration: none;}');
, new Asset\HttpAsset('http://domain.tld/assets/style.css');
);

Но AssetFactory::createAsset() не принимает свои собственные активы.Мне нужна возможность использовать StringAsset, потому что мне нужно изменить некоторые значения в CSS / JS, на стороне сервера.

Есть ли другой способ добиться этого, кроме использования AssetFactory::createAsset()?

1 Ответ

0 голосов
/ 15 марта 2012

Похоже, что вы сможете по существу воспроизвести внутреннюю работу метода createAsset, замкнув накоротко части, которые доставляют вам проблемы:

$asset = new AssetCollection(self::$stylesheets);

$filters = array
    (   'less' // Less CSS Compiler
    ,   'import' // Solves @imports
    ,   'rewrite' // Rewrites Base URLs when moving to another URL
    ,   'min' // Minifies the script
    );

$options = array('output' => 'assetic/*.css');

foreach ($filters as $filter) {
    if ('?' != $filter[0]) {
        $asset->ensureFilter(self::getCssAssetFactory()->getFilterManager()->get($filter));
    } elseif (!$options['debug']) {
        $asset->ensureFilter(self::getCssAssetFactory()->getFilterManager()->get(substr($filter, 1)));
    }
}

$asset->setTargetPath(str_replace('*', self::getCssAssetFactory()->generateAssetName(self::$stylesheets, $filters, $options), $options['output']));

... все это должно адекватно заменить вашувызовите createAsset ().Если у вас есть работники, которых вы добавили в assetFactory, вам также необходимо реализовать это.

...