Laravel4.2でTwigを使う
こんにちは。
PHPの文法すらもよくわかっていない私ですが「勉強するにはまず作ってみることだ!」ということで、PHP & PHPのモダンなフレームワーク & MySQLの学習目的で、ちょっとしたWebアプリを作ってみようと思っています。
作るにあたって、せっかくならトレンドなフレームワークを使ってみようと思い、Laravel4.2を使うことにしました。
Laravelには標準的なテンプレートエンジンとしてBladeというものが用意されているのですが、ちょっと調べてみたところ、あまりイケてなさそう。
なぜイケてなさそうと思ったのかというと、エスケープが自動でなかったり、素のPHPも書けちゃうぜ的なところです。
普段は大規模な組み込み開発のエンジニアをやっているせいか「ヒューマンエラーが起きやすい」とか「きちんとした責務分割が強制されていない」ということが、どうしても気になっちゃうんですよね。これ不具合生まれやすいなーと思ってしまう。
ケース・バイ・ケースで一概に悪いこととは言い切れないのですが(特に後者)、個人的にはあんまり好みじゃないということで。
(Webアプリのことをよく理解していない初心者なので、考えが変わることもあるかもしれません)
Bladeじゃなかったら何を使う?ということで、Twigを使うことにしました。
エスケープ自動だし、素のPHPは基本的に書けないような感じみたいだし、イケてそう。
しかも、Laravelで簡単にTwigを使える「TwigBridge」というプラグインがあるらしい。
- TwigBridge
https://github.com/rcrowe/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 %}
表示はこうなる。
簡単ですね!