2012-03-15 9 views
0

私は、多くのCSS資産を1つに結合し、それらを縮小してダンプする方法をいくつか持っています"/assetic/6bad22c.css"のような生成されたファイル名にキャッシュされます。私は、次を使用することによってこれを実現:

現在、私はここで

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(); 
} 

経由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; 
} 

を使用して資産を作成するには、参照メソッドです:

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') 
    ); 
} 

ここまでの魔法はありません。私の問題は、配列definitionによるself::$stylesheetsの配列には、アセットへのパス文字列だけが含まれているということです。しかし、私はこの方法のような本当のAssetic資産を使用するが必要

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、serversideのいくつかの値を変更する必要があるからです。

AssetFactory::createAsset()以外でこれを達成する別の方法はありますか?

+0

どうなりますか?間違いはありますか?あなたは何の結果を期待していますか?私はAssetFactoryに精通していませんが、より多くの情報が参考になります。 – Jason

+0

いいえ、私のメソッドは正常に動作します。エラーはありません。しかし、私は元のAssetic資産でそれらを拡張する必要があります。 'AssetFactory :: createAsset()'メソッドにパス文字列の代わりにAssetsを追加しようとすると、次のエラーで失敗します:__致命的なエラー:Assetic \ Asset \ FileAsset型のオブジェクトを配列として使用できません。 ] \ lib \ vendor \ Assetic \ src \ Assetic \ Factory \ AssetFactory.phpの行270__には含まれていません。 – kernel

+0

私たちはどこかに行っていると思います。私が何を扱っているかを少し見てみました。 createAssetメソッド*は文字列または文字列を消費しなければなりません。また、任意の型のオブジェクトは常に失敗します。あなたの入力を処理するとき、オブジェクトのparseInput()を呼び出し、行270のエラーに従って、入力を配列として扱います。文字列では、最初の文字にアクセスしているだけです。オブジェクトでは、致命的なエラーが発生します。あなたはあなたが望むことをすることはできません。なぜあなたは文字列ではなくAssetic Assetsを渡す必要がありますか? – Jason

答えて

0

あなたは、本質的に短いあなたの問題を与えている部分短絡、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'])); 

をそのすべてが適切にあなたの電話を交換する必要があります... Asset()を作成します。 assetFactoryに追加した作業者がいる場合は、それを実装する必要があります。

+0

これは最善の解決策ではないかと心配しています...すでに短絡のコードを提供してくれてありがとう!私は私の問題を解決するために同じ解決策を望んでいました。 アシテックがこれをそのままの状態で提供しない理由を想像することはできません...私は唯一のものではありません。 – kernel

関連する問題