PHPフレームワークLaravelのviewではbladeというテンプレートエンジンが使えます。
このブレードってやつについてまとめてみました。
bladeって何なのさ
ブレードはクラスのように階層化したテンプレートエンジンです。
階層化されているので、たとえばフッターとかの決まりきった部分は基底クラスに定義して、bodyの中だけを書いたbladeを読みこむ、という使い方ができます。
サンプル
今回は二つのblade、base.blade.phpとindex.blade.phpがあるとします。
基底クラス側となるbase.blade.phpはこんな風に書かれます。
<html>
<head>
<title>@yield('title')</title>
</head>
<body>
@section('body')
base
@show
</body>
</html>
この@がついている部分がblade用の記述です。
@yieldは変数を読み込んでいるような感じで理解すればいいですね。
echo $titleと書かれているようなもので、$titleは子クラス(クラスじゃないけど)で定義します。
@sectionは関数というかブロックというか、一つのまとまりです。
@sectionの終わりを@showとしているので、base単体で呼んでもこのまま表示されます。
続いて子供側となるindex.blade.phpを見てみましょう。
こんな感じです。
@extends('base')
@section('title')
title sub
@endsection
@section('body')
@parent
sub
@stop
@extendsは継承元を記載します。
class index extends baseといった感じ。
んでsectionが二つ書かれていますが、@section('title')はbase側のyieldに入る値です。
次の@section('body')には@parentとあるので、親クラスの@section('body')の中身であるbaseという文字列が読まれ、次にsubという文字列が読まれます。
結果的にこれを読みだすと
<html>
<head>
<title>title</title>
</head>
<body>
base
sub
</body>
</html>
となるわけです。
Controllerから呼ぶ
呼び方は普通にviewを呼ぶのと一緒。
public function index()
{
return view('test/index', ['value' => 1]);
}
この場合はresource/views/test/index.blade.phpというファイルがあればそっちを優先して呼ばれます。
無ければresource/views/test/index.phpが呼ばれます。
他の@要素
@yield、@section以外にも色々な@要素があるので紹介します。
{{ $var }}
echo $varと一緒です。htmlentitiesが自動でかぶさります。昔は{{{ }}}と{{ }}でエスケープする、しないが分かれていたようだけど5系はどっちもエスケープするっぽい。
{!! $var !!}
こちらはエスケープしない版。
{{ $var or 'default' }}
echo $var !== null ? $var : 'default'のような感じ。
{{-- Comment --}}
コメントです。
@extends('layout')
親ブレードを指定します。
@if(condition)
ifです。コントローラーから渡した変数が使えます。
@if (Auth::guest())
<li><a href="{{ route('login') }}">Login</a></li>
@else
・・・
@endif
@else
elseです。
@elseif(condition)
elseifです。
@endif
ifの終わりです。
@foreach($list as $key => $val)
phpのforeachと同じです。
@endforeach
foreachの終わりです。
@for($i = 0; $i < 10; $i++)
phpのforと同じです。
@endfor
forの終わりです。
@while(condition) - phpのwhileと同じです。
@endwhile - whileの終わりです。
@unless(condition) - if (!condition)という意味です。
@endunless - unlessの終わりです。
@include(file) - 他のブレードを読み込みます。
@include(file, ['var' => $val,...]) - 他のブレードを読み込み、変数を与えます。
@each('viewfile-to-render', $data, 'variablename') - foreach($data as $variablename)という形式でviewfile-to-renderブレードを読み込みます。
@each('viewfile-to-render', $data, 'variablename','optional-empty-viewfile') - 上記と同様ですが、$dataが空の場合はoptional-empty-viewfileを読み込みます。
@yield('section') - sectionを当てはめる場所です。
@section('name') - セクションの開始を示します。
@show - セクションの終わりを示します。showはそのまま表示されます。
@stop - セクションの終わりを示します。stopはyieldの場所にしか表示されません。
@endsection - Laravel3の頃に使われていたセクションの終わりです。現在でも使えます。
@append - 上位ブレードで同じセクションがあった場合、追記されます。
@overwrite - 上位ブレードで同じセクションが合った場合、上書きされます。
@parent - 上位ブレードのセクションをそのまま読み込みます。
@lang('message') - 現在の言語に沿った文章を表示します。
@choice('message', $count) - 現在の言語に沿った文章を複数形で出す場合に$countが使われます。
こんなもんかな。
まだあったら追記します。