私はこのための解決策は、私は最終的に自分自身を作成するために管理が見つかりませんでしたので:埋め込まれたスクリプトにAssetics uglifyJS2
フィルタを適用するために私の(既存の)小枝の拡張子にカスタムタグを追加:
ステップ1:をAsseticにコンテンツを渡すためにNode
で使用されUglifier
クラスを、追加:小枝TokenParser
とNode
class UglifyTokenParser extends Twig_TokenParser {
private $enabled;
public function __construct($enabled = true) {
$this->enabled = (bool) $enabled;
}
public function parse(Twig_Token $token) {
$lineNumber = $token->getLine();
$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
$body = $this->parser->subparse(function (Twig_Token $token) {
return $token->test('enduglify');
}, true);
$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
if ($this->enabled) {
$node = new UglifyNode($body, $lineNumber, $this->getTag());
return $node;
}
return $body;
}
public function getTag() {
return 'uglify';
}
}
class UglifyNode extends \Twig_Node {
public function __construct(Twig_Node $body, $lineNumber, $tag = 'uglify') {
parent::__construct(array('body' => $body), array(), $lineNumber, $tag);
}
public function compile(Twig_Compiler $compiler) {
$compiler
->addDebugInfo($this)
->write("ob_start();\n")
->subcompile($this->getNode('body'))
->write("echo \$context['_uglifier']->uglify(trim(ob_get_clean()));\n");
}
}
ステップ2を作成します。 UglifyJS2Filter
class Uglifier {
private $filter;
private $asset;
private $enabled;
public function __construct(FilterInterface $filter, $endabled) {
$this->filter = $filter;
$this->asset = new UglifierAsset(array($this->filter));
$this->enabled = $endabled;
}
public function uglify($content) {
if ($this->enabled) {
$this->asset->loadContent($content);
$uglified = $this->asset->dump();
return $uglified;
} else {
return $content;
}
}
}
class UglifierAsset extends BaseAsset {
public function __construct($filters = array()) {
parent::__construct($filters);
}
private $theContent;
public function loadContent($content) {
$this->theContent = $content;
$this->load();
}
public function load(FilterInterface $additionalFilter = null) {
$this->doLoad($this->theContent);
}
public function getLastModified() {
return 0;
}
}
ステップ3:、sServiceとしてUglifier
を作成Twig Extension
に渡し、拡張子の中にカスタムタグを実装
app.twig_extension:
class: AppBundle\Twig\AppExtension
public: false
arguments: [ "@app.twig_extension.uglifier" ]
tags:
- { name: twig.extension }
app.twig_extension.uglifier:
class: AppBundle\Twig\uglify\Uglifier
arguments: [ "@assetic.filter.uglifyjs2", "%twig_extension.unglifier.enabled%" ]
class AppExtension extends \Twig_Extension implements \Twig_Extension_GlobalsInterface {
private $uglifier;
public function __construct(Uglifier $uglifier) {
$this->uglifier = $uglifier;
}
public function getGlobals() {
return array(
'_uglifier' => $this->uglifier,
);
}
public function getTokenParsers() {
return array(new UglifyTokenParser());
}
}
ステップ4:{ `新しいとラップ埋め込まれたスクリプト%uglify%}タグ
{# before #}
<script type="text/javascript">
// some JS
</script>
{# after #}
<script type="text/javascript">
{% uglify %}
// some JS
{% enduglify %}
</script>
DONE
ほとんどの場合、コードの99%を別々のファイルに委託することができます。あなたのtwigテンプレートにasseticで含めることができ、JavaScriptの一部のみをインラインスクリプトとして残します。私はそのアプローチを主に動的な設定パラメータ、初期化JSONデータなどに使用します。 –
確かに、これは絶対に正しいです。しかし、私のプロジェクトでは、コードの5〜10%がHTML/Twigで使用されていると推定しています。しかし、それが1%、5%、50%であれば問題ではありません。場合によっては、インラインコードを処理するほうが簡単です。したがって、問題は**ファイルを分離する**に移動せずに、このコードをどのように縮小/醜化するかです。 –