Home | Symfony2Doc

ご注意

Symfony2日本語翻訳ドキュメントは内容が古くなっております。公式サイトの英語ドキュメントを参照してください。

Note

  • 翻訳更新日:2013/06/12

カスタムTwig拡張の書き方

カスタムTwig拡張を書く主な動機は、国際化のようなよく使うコードを再利用可能なクラスにすることです。 Twig拡張には、タグ、フィルタ、テスト、演算子、グローバル変数、関数、ノードビジターを定義することができます。

拡張を書くことで、コンパイル時のコードと実行時のコードをきれいに分離することもできるようになります。あなたのコードも少し速くなります。

Tip

自作のTwig拡張を書く前に、Twigの公式拡張レポジトリも見てみてください。

Twig拡張クラスの作成

Note

このクックブックでは、Twig 1.12以降を対象としてカスタムTwig拡張の書き方を説明しています。もっと古いバージョンのTwigを使用している場合は Twig extensions documentation legacy を参照してください。

カスタムの機能を使うためには、まずTwig拡張のクラスを作成する必要があります。 一例として、数値を価格としてフォーマットするための価格フィルタを作るとします。

// src/Acme/DemoBundle/Twig/AcmeExtension.php
namespace Acme\DemoBundle\Twig;

class AcmeExtension extends \Twig_Extension
{
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('price', array($this, 'priceFilter')),
        );
    }

    public function priceFilter($number, $decimals = 0, $decPoint = '.', $thousandsSep = ',')
    {
        $price = number_format($number, $decimals, $decPoint, $thousandsSep);
        $price = '$'.$price;

        return $price;
    }

    public function getName()
    {
        return 'acme_extension';
    }
}

Tip

フィルタだけでなく、カスタムの関数を作ったり、グローバル変数を登録したりすることもできます。

Twig拡張をサービスとして登録

新しいTwig拡張をサービスコンテナに登録しましょう。

  • YAML
    # src/Acme/DemoBundle/Resources/config/services.yml
    services:
        acme.twig.acme_extension:
            class: Acme\DemoBundle\Twig\AcmeExtension
            tags:
                - { name: twig.extension }
    
  • XML
    <!-- src/Acme/DemoBundle/Resources/config/services.xml -->
    <services>
        <service id="acme.twig.acme_extension" class="Acme\DemoBundle\Twig\AcmeExtension">
            <tag name="twig.extension" />
        </service>
    </services>
    
  • PHP
    // src/Acme/DemoBundle/Resources/config/services.php
    use Symfony\Component\DependencyInjection\Definition;
    
    $container
        ->register('acme.twig.acme_extension', '\Acme\DemoBundle\Twig\AcmeExtension')
        ->addTag('twig.extension');
    

Note

Twig拡張は遅延ロードされないので、注意してください。 これは、もしrequestサービスに依存していた場合に、CircularReferenceExceptionScopeWideningInjectionException がかなりの確率で発生するということを意味します。 より詳細に知りたければ スコープの使用方法 を読んでください。

カスタムTwig拡張を使う

新しく作成したカスタムTwig拡張の機能は、通常の機能とまったく変わりなく使用できます。

{# $5,500.00 を表示 #}
{{ '5500'|price }}

カスタムのフィルタに引数を渡す例です。

{# $5500,2516 を表示 #}
{{ '5500.25155'|price(4, ',', '') }}

もっと詳しく学ぶ

Twig拡張についてもっと詳しく知りたい場合は、Twig extensions documentation を読んでください。

blog comments powered by Disqus