LOG

Laravel5 Bladeテンプレートの親子関係と外部読み込みとか

なんて言えばいいのかよくわかってないけど
「@extendsディレクティブ」や「@includeディレクティブ」を使ったときのコンテンツの表示順番に関するメモ。
※ コードは読んでいないので間違ってるかもしれない。気付き次第修正

上から下に読んでいく


@section('cnt')
    1
@stop

@yield('cnt')

これだと「1」と表示されるけど、以下の内容だと出ない。

@yield('cnt')

@section('cnt')
    1
@stop

@yieldを実行したときにまだセクションにコンテンツが注入されていない為、表示されない。


extendsディレクティブを使った場合

まず子テーマが評価されから親テーマが評価される。

# ========================
# parent.blade.php
# ========================
@section('cnt')
    1
@stop

# ========================
# page.blade.php
# ========================
@extends('parent')

@yield('cnt')

これはセクション「cnt」にコンテンツを注入するまえにyieldを読んでいるので何も表示されない。
表示させるためには

# ========================
# parent.blade.php
# ========================
@yield('cnt')

# ========================
# page.blade.php
# ========================
@extends('parent')

@section('cnt')
    1
@stop

となる。
また親のレイアウトの後に子テンプレートのレイアウトを追加したい場合は

# ========================
# parent.blade.php
# ========================
@section('cnt')
    1
@show

# ========================
# page.blade.php
# ========================
@extends('parent')

@section('cnt')
    @@parent
    2
@stop

という感じにparentディレクティブを使う。
extendsディレクティブを使ってテンプレートを継承する場合は、親子関係になっているので
@extends(‘xxx’)の行に親テンプレートの内容が展開されるわけではない。


@includeを使った場合

対してincludeディレクティブは
phpのinclude関数のように外部のテンプレートを読み込む

# ========================
# external.blade.php
# ========================
@section('ex_cnt')
    1
@show

# ========================
# page.blade.php
# ========================
@include('external')

@section('p_cnt')
    2
@show

とすると「1 2」と表示される。
includeディレクティブで呼ばれたテンプレートは「partial(部分的な)」って呼ばれているからコンテンツの一部を外部化して
includeして追加するっていう感じかと。