ミリサイズ

頭の中をコピー・ペースト

Laravel4.2でTwigを使う

こんにちは。

PHPの文法すらもよくわかっていない私ですが「勉強するにはまず作ってみることだ!」ということで、PHP & PHPのモダンなフレームワーク & MySQLの学習目的で、ちょっとしたWebアプリを作ってみようと思っています。

作るにあたって、せっかくならトレンドなフレームワークを使ってみようと思い、Laravel4.2を使うことにしました。

Laravelには標準的なテンプレートエンジンとしてBladeというものが用意されているのですが、ちょっと調べてみたところ、あまりイケてなさそう。
なぜイケてなさそうと思ったのかというと、エスケープが自動でなかったり、素のPHPも書けちゃうぜ的なところです。
普段は大規模な組み込み開発のエンジニアをやっているせいか「ヒューマンエラーが起きやすい」とか「きちんとした責務分割が強制されていない」ということが、どうしても気になっちゃうんですよね。これ不具合生まれやすいなーと思ってしまう。
ケース・バイ・ケースで一概に悪いこととは言い切れないのですが(特に後者)、個人的にはあんまり好みじゃないということで。
(Webアプリのことをよく理解していない初心者なので、考えが変わることもあるかもしれません)

Bladeじゃなかったら何を使う?ということで、Twigを使うことにしました。
エスケープ自動だし、素のPHPは基本的に書けないような感じみたいだし、イケてそう。
しかも、Laravelで簡単にTwigを使える「TwigBridge」というプラグインがあるらしい。

導入は超簡単です。
GithubのREADMEを読むだけで十分だと思いますが、「英語を見ると蕁麻疹が出るぜ!」という人のために、一応手順を書いておきます。
(なお、私は英語が大の苦手です。勉強中)

導入手順

1. インストール

LaravelのProjectフォルダにあるcomposer.jsonのrequireに、下記のように追記します。

"require": {
    "laravel/framework": "4.2.*",
    "rcrowe/twigbridge": "0.6.*"     //この行を追記
},

これでcomposer updateを実行。

2. configファイル(config/app.php)の編集

config/app.phpに下記の内容を追記します。

// config/app.php
/*
|--------------------------------------------------------------------------
| Autoloaded Service Providers
|--------------------------------------------------------------------------
|
     ・
     ・
     ・
  'providers' => array(
     ・
     ・
     ・

        'TwigBridge\ServiceProvider',

  ),
     ・
     ・
     ・
/*
|--------------------------------------------------------------------------
| Class Aliases
|--------------------------------------------------------------------------
     ・
     ・
     ・
  'aliases' => array(
     ・
     ・
     ・
        'Twig'              => 'TwigBridge\Facade\Twig',

  ),

準備はこれだけです。 簡単ですね!

使い方

Laravel上でBladeを使う時と同じ感覚で扱えます。 例えば、hello.twigファイルを使ってViewを表示するなら下記のように。

// app/routes.php
Route::get('/', function()
{
    return View::make('hello');
});

値を渡すときも、Bladeを使う場合と同じでいけます。

// app/routes.php
Route::get('/', function()
{
    return View::make('hello', array('name'=>'8miricd'));
});

Viewのほうも普通にTwigで書く場合と一緒。

// app/views/hello.twig
{% autoescape true %}
<html>
<head>
    <meta charset="UTF-8">
    <title>TwigTest</title>
</head>
<body>
Hello! {{name}}<br>
</body>
</html>
{% endautoescape %}

表示はこうなる。

f:id:miri8cd:20150103164532p:plain

簡単ですね!