移転しました。

SymfonyはなぜTwigを採用したのか ~ Jinjaとの関係

Symfony Advent Calendar 2018 10日目の記事です。

SymfonyはテンプレートエンジンにTwigを採用しています。TwigはPython製のJinjaにシンタックスが似ていることで知られています。SymfonyがなぜTwigを採用したのか、なぜJinjaと似ているのかについて日本語の情報が少なそうなので書いてみようと思います。

ただ、内容としてはほとんどSymfonyの作者であるFabien Potencierのブログ記事で触れられているものです。

Templating Engines in PHP | Articles - Fabien Potencier

この記事は2009年10月にポストされたものです。この時のSymfony(当時はsymfony)のバージョンは1.3で11月に1系最後である1.4がリリースされています。彼がこの時期にどのようなテンプレートが望ましいか考え悩んだ結果が吐露されています。

記事の最初に「私と意見が合わなくて殺したい人がいるかも」という注意が書いてあることから当時のテンプレートエンジンに対する議論の白熱?具合が伺えます。

記事に書かれていること

PHP自体が良いテンプレートとは思えない

この記事の前半ではDjangoPythonのウェブフレームワーク)のテンプレートと比較して次のようなことが書かれています。

  • PHP自体がテンプレートだという主張があるが…
    • PHPは(言語としては進化してるが)テンプレートとして進化していない
      • 短く書けない
      • ありがちな処理をサポートしていない(例えばfor-else)
      • 再利用性がない(継承など)
        • 注: クラス継承ではなくテンプレート継承の意です
      • エスケープが大変(DjangoRailsは自動エスケープなのに)
      • サンドボックス化できない

PHPの既存テンプレートに良いものがない

中盤では既存のPHP製テンプレートエンジンを探してみたけどいいのがない、ということが書かれています。Smarty、PHPTAL、eZ Components Templates、Dwoo、Calypsoを取り上げています。

Twigとの出会い

後半ではTwigにたどり着いた経緯が書かれています。

  • Djangoのテンプレートっぽいものを探したところTwigを見つけた
  • TwigはJinja作者であるArmin Ronacherによって書かれたもの
    • 注: JinjaはPython製のテンプレートエンジンでDjangoのテンプレートと似ているけど別もの
  • 2008年にとあるサービス向けにTwigが作られたがArminはPythonで仕事してる
  • 彼にTwigを発展させてもいいか聞いたら乗り気になってくれた

その後

Symfony 2がリリースされたのは約2年後の2011年7月です。この時にデフォルトのテンプレートエンジンとしてTwigが採用されています。

Twigの最初のgitコミットを確認すると2009年10月7日となっています。そして先に紹介したFabienの記事の日付は同じく2009年10月7日です。この日のコミットは開発ではなくgit-svnを使ったSVNリポジトリ(おそらくArminが使っていたものと思われます)からのポーティングですが、これからやっていくぞという意気込みを感じるコミットです。

現在のTwigはSensioLabs(FabienがCEOの会社)やSymfony開発者によってメンテされ、9年間経った今でもSymfonyを支える重要なパーツとして生き続けています。