Nullyのぶろぐ

仙台で働くエンジニアの日記

Zend FrameworkのViewをTwigで拡張する

以前の記事で試しに使ってみたTwigですが、これをZend Frameworkの標準のViewにしたいな!ということでやってみました。

とあるブログの記事を参考にして組み上げているので、若干パクリが入っています。

ごめんなさい。

注意事項

この記事を書いた時点で利用しているそれぞれのバージョンは以下のとおりです。

Zend Framework 1.10.0 alpha 1

Twig 0.9.5 DEV

今後のバージョンアップによって動作に何かしら違いが出ると思いますので、ご注意ください。

下準備

まずは、Zend FrameworkでTwigを利用するための下準備を行います。

プロジェクトを作る

まずは、適当にプロジェクトを作ります。

$ zf create project twig_test

プロジェクトファイルができたら「library」フォルダに「My」フォルダを作っておきます。

次に以前の記事と同様にTwigをダウンロードします。

ダウンロードしたら、展開し、展開されたフォルダの「lib」フォルダ以下にある「Twig」フォルダを「twig_test/library」にコピペします。

Bootstrap.phpにNamespaceを追加するやつを書く

「twig_test」の直下にある「Bootstrap.php」を編集していきます。

以下のコードを記述します。

protected function _initNamespace() {

$autoloader = new Zend_Application_Module_Autolaoder(array(

"basePath" => realpath(APPLICATION_PATH. "/../library"),

"namespace" => ""

));

$autoloader->addResourceType("my", "My", "My");

return $autoloader;

}

リソースのタイプを追加し、「library」以下に配置した時に、自動で読み込まれるようにします。(若干使い方おかしいかもですが...)

次はTwigのTwig_Autoloader::autoload()をZend_Loader_Autoloaderに追加します。

protected function _initAutoloaderNamespace()

{

$autoloader = $this->bootstrap("FrontController")->getApplication()->getAutolaoder();

$autoloader->pushAutoloader(array("Twig_Autolaoder", "autoload"));

}

で、次にZend_Viewの代わりにMy_Twig_Vewを登録してあげます。

protected function _initTwigView()

{

$options = $this->getOption("twig");

$view = new My_Twig_View(APPLICATION_PATH. "/views/scripts", $options);

$renderer = Zend_Controller_Action_HelperBroker::getStaticHelper("viewRenderer");

$renderer->setView($view)->setViewSuffix("html");

}

ここまでがBootstrap.phpの設定です。

次に「application/config/application.ini」を編集していきます。

twig.debug       = true

twig.trim_blocks = false

twig.charset = "utf-8"

twig.base_template_class = "Twig_Template"

twig.cache = APPLICATION_PATH "/views/caches"

twig.auto_reload = true

この設定は、Twig_Environmentクラスで設定するキャッシュなどの設定です。

上から順に「デバッグ」、「空白除去の可否(?)」、「チャーセット」、「テンプレートのベースクラス名」、「キャッシュパス」、「キャッシュ更新を自動で行うか」です。

チャーセットはネタですごめんなさい。

この設定項目はTwig公式のTwig for Developpersページを見てください。

My_View_Twigを作る

次に、実際に表示させるためのクラス「My_View_Twig」を作ります。

流れ的には、「Zend_View_Interface」をインプリして、実装内容を実装していくだけです。

view->hoge = array(

"param1" => 1,

"param2" => 2,

"param3" => 3

);

後はビューファイルから変数を参照すれば表示されるハズです。

「views/scripts/index/index.html」に簡単に書いてみます。

 

<h1>Twig Test</h1>

<p>{{ hoge.param1 }}</p>

<p>{{ hoge.param2 }}</p>

<p>{{ hoge.param3 }}</p>

 

正常に記述とかパスとかいろいろあっていればPタグにそれぞれ1〜3の数字が記述されていると思います。

Twigって素敵

私も最近知ったのですが、このテンプレートエンジンはいいなぁと思いました。

名前もなんか好きw(トゥイッグ?トゥワイ?)

おまけ

Twigには{% debug hoge%}と書いてあげると、PHPのvar_export()が実行された内容が吐き出されます。

が、var_dump()のがいい!!という場合は、Twig_Node_Debug.phpをコピーしてTwig_Node_Dump.phpにリネーム、Twig_TokenParser_Debug.phpをTwig_TokenParser_Dump.phpにリネームして上げます。

これらのコピーしたファイルをエディタで開き、「debug」と記述されている処を「dump」に変更すればvar_dump()の出力になるはずです。

わざわざ拡張子泣くてもいいかなぁとは思いましたけどついやってしまいました。

参考URL一覧

09/12/29 追記

すみません。

APPLICATION_PATH/configsのapplication.iniに以下の内容を追記しないと動かないです...。

単に書き忘れてしまっていました...。

autoloaderNamespaces.twig = "Twig"

これはAutoloaderにTwigという名前の名前空間を追加しています。

これは他の外部ライブラリなどでも同様に記述できます。

例にDoctinreを挙げてみると

autoloaderNamespaces.doctrine = "Doctrine"

と、こんな感じになります。

これを追記しないと、「$autoloader->pushAutolaoder(array("Twig_Autoloader", "autoload"))」の部分でコールバックとして正しくないよ!というエラーが吐き出されます。