人生の恥は書き捨て

プログラムとかいろいろ

【Laravel入門】Bladeテンプレート

引き続きLaravelについて勉強していきたいと思います。

バックナンバー的なもの
【Laravel入門】 インストールから起動まで - 人生の恥は書き捨て
【Laravel入門】ルーティング - 人生の恥は書き捨て

LaravelのViewではBladeテンプレートという便利なテンプレートが使えるので、
それの紹介をします。

Bladeテンプレートとは

BladeテンプレートはLaravelの組み込みテンプレートです。
viewにphpをそのまま書くと煩雑になってしまうような、
テンプレートの継承、テンプレート処理、イテレーター処理などを、
簡単簡潔に記述することができます。

Bladeテンプレートのファイルは ファイル名.blade.phpで保存します。

使ってみる

レイアウト
app/views/layouts/master.blade.php

<html>
<body>
@section('sidebar')
parent
@show

<div class="container">
    @yield('content')
</div>
</body>
</html>

ビュー
app/views/template.blade.php

@extends('layouts.master')

@section('sidebar')
@parent
<p>child</p>
@stop

@section('content')
<p>ここは本文のコンテンツ</p>
@stop

こんな感じで使うことができます。


セクションの宣言をして

@yield('content')

セクションを実装します。

@section('contents')
<p>ここは本文のコンテンツ</p>
@stop

レイアウトで共通部分をだけを実装して、残りの部分の実装は個別のテンプレートに任せる場合は、
sidebar部分のように

宣言

@section('sidebar')
parent
@show

実装

@section('sidebar')
@parent
<p>child</p>
@stop

というようにします。

@show と @stop

Bladeテンプレートは、正規表現を使って置換を行っているだけなので、
想定されない使い方をすると変わった挙動をするようです。

@showの部分は継承したときに個別のviewが表示されるところを表していて、
継承したときに末尾に@stopをつけるわけですが、
じゃあ2回継承した場合どうなるの?って思ったのでやってみました。

master.blade.php

@section('sidebar')
master
@show

master2.blade.php

@extends('layouts.master')

@section('sidebar')
@parent
<p>master2</p>
@show

template.blade.php

@extends('layouts.master2')

@section('sidebar')
@parent
<p>template</p>
@stop

これで2重継承できました。
でも書き方が直感的じゃないというか@stopが2回ってどうなの?
master2の@stopを@showに変えると表示がおかしくなってしまいます。