特定の拡張子に Assetic フィルターを適用するには?
=================================================
Assetic フィルターは、個々のファイル、ファイルを集めたグループ、そして、この記事で説明するように特定の拡張子を持つファイル群、に対して適用することができます。例として Assetic の CoffeScript フィルターを使って JavaScript にコンパイルするケースを見ていきましょう。
メインの コンフィギュレーション に cofee と node へのパスを指定します。デフォルトでは、それぞれ ``/usr/bin/coffee`` と ``/usr/bin/node`` になります。
.. configuration-block::
.. code-block:: yaml
# app/config/config.yml
assetic:
filters:
coffee:
bin: /usr/bin/coffee
node: /usr/bin/node
.. code-block:: xml
.. code-block:: php
// app/config/config.php
$container->loadFromExtension('assetic', array(
'filters' => array(
'coffee' => array(
'bin' => '/usr/bin/coffee',
'node' => '/usr/bin/node',
),
),
));
1つのファイルをフィルターする
------------------------------
上記の指定で、テンプレート上で 1つの CoffeeScript ファイルを JavaScript に出力することができるようになりました。
.. configuration-block::
.. code-block:: html+jinja
{% javascripts '@AcmeFooBundle/Resources/public/js/example.coffee'
filter='coffee'
%}
{% endjavascripts %}
.. code-block:: html+php
javascripts(
array('@AcmeFooBundle/Resources/public/js/example.coffee'),
array('coffee')) as $url): ?>
CoffeeScript ファイルをコンパイルして JavaScript に変更するのに必要なことは、これだけです。
複数のファイルをフィルターする
------------------------------
複数の CoffeeScript ファイルをコンパイルして、1つのファイルとしてまとめて出力することもできます。
.. configuration-block::
.. code-block:: html+jinja
{% javascripts '@AcmeFooBundle/Resources/public/js/example.coffee'
'@AcmeFooBundle/Resources/public/js/another.coffee'
filter='coffee'
%}
{% endjavascripts %}
.. code-block:: html+php
javascripts(
array('@AcmeFooBundle/Resources/public/js/example.coffee',
'@AcmeFooBundle/Resources/public/js/another.coffee'),
array('coffee')) as $url): ?>
これで2つのファイルをコンパイルして 1つの JavaScript ファイルとして出力することができました。
ファイル拡張子に基づいてフィルターする
--------------------------------------
Assetic を使用する大きなアドバンテージは、たくさんのアセットファイルを固めることで HTTP リクエストを減らすことです。 *全て* のJavaScript ファイルや CoffeeScript ファイルを一緒に結合させて、最終的に1つの JavaScript ファイルとして出力できたら、 HTTP リクエストを減らすことができます。しかし、その JavaScript ファイルを上記の結合するファイルのリストに加えるだけでは、 CoffeeScript のコンパイルとバッティングしてしまいます。
この問題を避けるには、コンフィギュレーションの ``apply_to`` オプションを使用して、特定の拡張子に常に適用されるフィルターを指定してください。下記の設定では、全ての ``.coffee`` 拡張子を持つファイルを Coffee フィルターに適用させています。
.. configuration-block::
.. code-block:: yaml
# app/config/config.yml
assetic:
filters:
coffee:
bin: /usr/bin/coffee
node: /usr/bin/node
apply_to: "\.coffee$"
.. code-block:: xml
.. code-block:: php
// app/config/config.php
$container->loadFromExtension('assetic', array(
'filters' => array(
'coffee' => array(
'bin' => '/usr/bin/coffee',
'node' => '/usr/bin/node',
'apply_to' => '\.coffee$',
),
),
));
これでテンプレート内で ``coffree`` フィルターを指定する必要がなくなりました。また、 ``.coffee`` 拡張子のファイルのみが CoffeeScript フィルターを通過するので、同じように JavaScript ファイルもリストに加えて、1つの JavaScript ファイルとして結合することができるようになりました。
.. configuration-block::
.. code-block:: html+jinja
{% javascripts '@AcmeFooBundle/Resources/public/js/example.coffee'
'@AcmeFooBundle/Resources/public/js/another.coffee'
'@AcmeFooBundle/Resources/public/js/regular.js'
%}
{% endjavascripts %}
.. code-block:: html+php
javascripts(
array('@AcmeFooBundle/Resources/public/js/example.coffee',
'@AcmeFooBundle/Resources/public/js/another.coffee',
'@AcmeFooBundle/Resources/public/js/regular.js'),
as $url): ?>
.. 2011/10/25 ganchiku 74788cbbdc762ef7c59ca6c512fc0e1aea503b9d