Laravel使ってみた (15) - テンプレートレイアウト -
http://laravel.com/docs/templates なドキュメント読みつつやってみた
@extends("layout")
@section("content")
省略
@stop
的な事をしていたけど、Illuminate\Routing\Controllers\Controllerには$layoutの設定及びsetupLayoutメソッドを実装する事でもテンプレートレイアウトな方式を利用出来るっぽい(Laravel初期状態からあるBaseControllerには実装されている?)
<?php
class HomeController extends Controller {
protected $layout = "layout";
protected function setupLayout() {
if (!is_null($this->layout)) {
$this->layout = View::make($this->layout);
}
}
public function index() {
$this->layout->content = View::make("index", array("samples" => [1, 2, 3]));
}
}
的なコントローラーをしておいて
@section("content")
{% raw %}
<ul>
@foreach ($samples as $sample)
<li>{{ $sample }}</li>
@endforeach
</ul>
{% endraw %}
@stop
的な感じで使える模様。で例えばレイアウト側が
<html>
<body>
@section("content")
abc
@stop
@yield("Content")
</body>
</html>
的な事をしている場合にはこのレイアウト側の@sectionな部分はレンダリングされない模様。例えばサイドバーとかにコンテンツ特有のを追加する場合にレイアウト側では既存するサイドバーに追加されるような形でレンダリングされたいような要件のある場合には@parentを使って、レイアウトを使ってる側からレイアウト側なセクションコンテントをレンダリング出来るようにする事も可能っぽい
でちょっと気になった件として、@extendsを使ってる場合だとコントローラーから設定された値等はView::share等を使わなくてもアクセス出来る。あくまで、@extendsを使ってる所からさらにネストされるView等に関してまでは伝播されないっていう所だったと思うのですが... でこのコントローラーでレイアウトをコントロールする方式だとコントローラーからView::makeした際に渡した値等は伝播されず利用できない模様。なのでView::share等を行うか、$this->layout->with等を使ってレイアウトに値を突っ込むなどのような処理が必要になる模様。んまぁ解釈が正しいかどうかまでは微妙ですけど...
とりまぁビュー側からレイアウトをコントロールする方式以外にもsetupLayout等を使ってコントローラーからレイアウトをコントロール出来る仕組みもあるっていう感じかなと
ちなみに、setupLayoutメソッドはIlluminate\Routing\Controllers\Controller#callActionメソッドで呼ばれてる模様
余談: Bladeの評価タグを変える方法
https://github.com/laravel/laravel/issues/1776#issuecomment-19350461 によると
Blade::setContentTags("開始タグ", "終了タグ");
的な事を使えば出来なくもないらしい