知らない家の目覚まし時計で目が覚めました。
LaravelはBladeっていうテンプレートエンジンをデフォルトで使います。
ほいで、Bladeって凄いんです。継承とか出来ちゃうんです。
@extends('XXX')
とか@parent
とかです。
もちろん他にも色々あるんだけど、一番継承がびっくりしました。
※こう書くと最近のテンプレートエンジンを知らないってバレそう
詳しくは、Laravel4 テンプレート が参考になると思います。
{{{ でもエスケープしたい時、{}を3つも書かなきゃいけないのは面倒だね!! }}}
自分が思うにhtmlをゴニョる時って、ヘッダーとコンテンツとフッターがあって、コンテンツを常にいじって、ヘッダーはmetaタグの中で動的に変わる部分があって面倒くさくて、フッターは別にみたいなイメージです。
あとはサイドバーとかナビバーとかかな。
その中でも、集中して修正したいのはコンテンツ部分だと思います。
んで、上手い事部品としてそれぞれ分割されているとやりやすいかと。
その辺り上記 Laravel4 テンプレート を参考に、ちょっと試行錯誤してみたので備忘録がてらに残してみます。
試したlaravelのバージョンは4.2です(4以降だったらOKだと思います)。
viewのソース
まず、ざっとソースを書いちゃいます。
最初に一応言っておくと、Bladeを使うにはviewファイルの拡張子(普通に.phpだよ)前に.blade
を入れる必要がありますです。
※こんな感じhoge.php => hoge.blade.php
あと、テンプレートは/app/views/〜
に置きます。
サンプルはこんな階層です。
/app/views/sample.blade.php # メインのテンプレート common/ # 共通部品置き場 layout.blade.php # レイアウト用 header.blade.php # ヘッダー footer.blade.php # フッター
レイアウト用 /app/views/common/layout.blade.php
@yield('header') @yield('content') @yield('footer')
- これが、全体の枠というかベースになる
- header,content,footerをyieldで宣言しておく
- yieldは引数で渡した名前の部品が書き込まれますんで読み込んで表示してくださいよ〜って頼む感じ(だと思われる)
ヘッダー用 /app/views/common/header.blade.php
@section('header') <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>{{{isset($title) ? $title : 'Hello'}}}</title> <link href="{{{asset('/assets/css/style.css')}}}" rel="stylesheet"> @yield('addCss') </head> @stop
@section('header')〜@stop
でここからここまでがheaderですよ〜って宣言する感じ- で、ここでベースとなるcssを読み込んでおいて、この下に
yield('addCss')
って宣言しておく - こうしておく事で、ページごとに読み込むcssを宣言できる
$title
のところはPHP書ければ分かると思いますasset()
はヘルパーメソッドで、publicディレクトリーのURLを返してくれる
フッター用 /app/views/common/footer.blade.php
@section('footer') <div> <p>フッター</p> </div> <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> @yield('addJs') </body> </html> @stop
@section('footer')〜@stop
でここからここまでがfooterですよ〜って宣言する感じ- で、ここでベースとなるjsを読み込んでおいて(例ではjQuery)、この下に
yield('addJs')
って宣言しておく - こうしておく事で、ページごとに読み込むjsを宣言できる
メインのテンプレート(コンテンツ用) /app/views/sample.blade.php
@extends('common.layout') @section('addCss') <link href="{{{asset('/assets/css/sample.css')}}}" rel="stylesheet"> @stop @include('common.header') @section('content') <body> <h1>Hello</h1> <div>コンテンツ</div> @stop @section('addJs') <script type="text/javascript" src="{{{asset('/assets/js/sample.js')}}}"></script> @stop @include('common.footer')
@extends('common.layout')
レイアウト用テンプレート(layout.blade.php)を使いまっせ〜という宣言- 読み込む時は、
.blade.php
は書かなくていいんです - 階層を表すには . を使います
common.layout
は/app/views/common/layout.blade.php
を読み込んでいる事になります
@section('content')〜@stop
でここから(ry@include('header')
でヘッダーを読み込んでるけど、その前に@section('addCss')XXX@stop
を書いておくことでheader.blade.php
で宣言しておいたaddCss
にXXXをレンダリングしてくれる@include('footer')
でフッターを(ry、その前に@section('addJs')XXX@stop
を書いておくことで(ry- ちなみに自分はよっぽどの事が無い限り、出力文字列はエスケープしろと教育を受けてきたのでこれでもかってくらいに
{{{ }}}
使っています - エスケープは
e()
っていうヘルパーもあるので、{{e('hoge')}}
でもOKだけど、めんどいなぁ
使ってみる
/app/routes.php
Route::get('/', function() { return View::make('sample') // 読み込む時.blade.phpは書かなくていいんです ->with('title', 'これはサンプル') // withでテンプレートに変数をセットします ; });
うん、しょぼいけど出ましたね。
出力されたhtmlのソースコードを一応見てみる
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>これはサンプル</title> <link href="http://local.sample.laravel.shimabox.net/assets/css/style.css" rel="stylesheet"> <link href="http://local.sample.laravel.shimabox.net/assets/css/sample.css" rel="stylesheet"> </head> <body> <h1>Hello</h1> <div>コンテンツ</div> <div> <p>フッター</p> </div> <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <script type="text/javascript" src="http://local.sample.laravel.shimabox.net/assets/js/sample.js"></script> </body> </html>
うん。意図したとおりに出てるのが確認出来ると思います。
なんでこんなにパーツを分けたか
ちょ、パーツ分けすぎwwwとか思うかもしれませんが、例えば(ありえないかもしれないけど)、このページだけはHTML5で他のページはXHTMLで!
とかそんなパターンがあった場合、DOCTYPEをXHTMLで書いたヘッダーパーツを用意しておいて
/app/views/common/xhtml_header.blade.php # こんなの用意しておく
viewで読み込む際に@include('common.xhtml_header')
って書けば対応可能です。
まぁ、何事もいい感じに部品として定義しておくのは大事な事どすえ。
他にもサイドバー部分とかナビ部分とか作っておくと捗ると思います。
まとめ
- laravelのbladeは便利
- bladeとかいって名前もかっこいい
- viewだけでレイアウトを結構定義できる
- でもエスケープはめんどい
以上、ざっと備忘録がてらに書いてみました。
何か参考になれば幸いです。
あれ?@parent
の事、書かなかったなぁ。。大丈夫ググれば大丈夫。
1件のコメント