概要
- 複数のビューで共通の部分がある場合、それらをまとめたビューを作って親とする(レイアウト)
- 共通レイアウトの中で、個々のビューごとに内容が異なる部分に
@yield
ディレクティブを書く - 個々のビューの最初で、レイアウトとして使うビューを
@extends
で指定する - レイアウトの中で
@yield
を書いた部分の具体の内容を@section
ディレクティブで書く - 異なるレイアウトでまとめられる部分がある場合は親のレイアウトにまとめて、異なる部分を親レイアウトの
@yield
と子レイアウトの@section
で書き、階層化する
レイアウトとビュー
レイアウトもビューファイルだが、複数のビューで共通化できる部分をまとめたのがレイアウト。
個別のページごとの内容に対応する部分を、レイアウト中で@yield
ディレクティブで名前を付けて仮置きしておく。
たとえば以下は各ページ共通のヘッダーをレイアウトに持たせて、個別ページのタイトルと内容はtitle
、content
という名前で仮置きしている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{{-- views/layouts/common.blade.php --}} <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>@yield('title')</title> </head> <body> <header style="background-color: #ccc"> <p>共通レイアウトに各ページ共通のヘッダーなどを置けます</p> </header> @yield('content') </body> </html> |
個別のページでは、
- レイアウトとして使うビューを
@extends
ディレクティブで指定する - レイアウト中
@yield
で仮置きした部分に対応する内容を@section
ディレクトリーで具体に書いていく
1 2 3 4 5 6 7 |
@extends('layouts.common') @section('title', '個別ページ') @section('content') <p>個々のページの内容</p> @endsection |
この例では、全体のレイアウトとして上で準備したビューファイルを指定して、タイトルと内容を@section
ディレクティブで具体に書いている。
@section
ディレクティブには以下の書き方がある。
- 2つ目の引数で内容を渡す方法
@section
~@endsection
の間に具体の内容を書く方法
レイアウトの階層化と継承
レイアウトが一部共通部分を持ちながら、いくつかの種類に分けられるような場合、レイアウトを階層化する。
例えばログイン前のページ、ログイン後のページが複数あり、ログイン前後でヘッダーメニューの構成が変わる場合。
ログイン前後でヘッダーメニューの内容は異なるが、ヘッダーメニューがあるという点は共通。
共通レイアウト
まず、大元のlayouts/common.blade.php
を以下のように準備する。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{{-- views/layouts/common.blade.php --}} <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>@yield('title')</title> </head> <body> @yield('header') @yield('content') </body> </html> |
このレイアウトでは、タイトル、ヘッダー、内容の3つを@yield
でプレースホルダーとしている。
個別レイアウト
次に、ログイン前とログイン後それぞれのレイアウトを準備する。
全体構造は共通のcommon
から@extends
で継承し、それぞれで異なる内容となる@yield('header')
に対応する部分だけを具体に書いていく。
個々のページによって異なる@yield('title')
と@yield('content')
についてはここでは対応せず、具体のビューで内容を埋める。
以下はログイン前のレイアウト。
1 2 3 4 5 6 7 8 9 |
{{-- views/layouts/logged_out.blade.php --}} @extends('layouts.common') @section('header') <header> {{-- ここにログイン前のメニューを書く --}} </header> @endsection |
また、以下はログイン後のレイアウト。
1 2 3 4 5 6 7 8 9 |
{{-- views/layouts/logged_in.blade.php --}} @extends('layouts.common') @section('header') <header> {{-- ここにログイン後のメニューを書く --}} </header> @endsection |
個別ビュー
個別のビューでは、大元の共通レイアウトを継承したログイン前/後いずれかのレイアウトを指定する。そして未対応@yield('title')
と@yield('content')
に対応する内容を@section
で埋めていく。
たとえばログイン前のログインページの例。
1 2 3 4 5 6 7 8 |
@extends('layouts.logged_out') @section('title', 'ログインページ') @section('content') <h1>{{ 'ログインページ' }}</h1> {{-- ここにログインページの内容を書く --}} @endsection |
またログイン後のトップページの例は以下の通り。
1 2 3 4 5 6 7 8 |
@extends('layouts.logged_in') @section('title', 'トップページ') @section('content') <h1>{{ 'トップページ' }}</h1> {{-- ここにトップページの内容を書く --}} @endsection |