作成日:2019-03-26, 更新日:2023-07-03
基本
・「@yield()」を使う
・「@yield(〇〇)」と「@section(〇〇)」を合わせる
・「@section(〇〇)」で設定した値が「@yield(〇〇)」に入る
・「@yield(〇〇)」に対応する「@section(〇〇)」が無ければ空白
・「@section(〇〇, 〇〇〇)」はHTMLは使えない
・「@section(〇〇)〇〇〇@endsection」はHTMLは使える
・「{{-- 〇〇〇 --}}」はコメント
・「@extends()」は継承(各ビューはベースになるテンプレートを継承させる)
・「@include()」は読み込み
▼使うビューたち
・ベースにするビュー(テンプレート)
・各ビュー
▼ベースにするビュー(テンプレート):resources\views\layout\base.blade.php
<!doctype html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>@yield('title')</title> </head> <body> @yield('h1') @yield('contents') </body> </html>
▼各ビュー
@extends('layout.base') @section('title', 'hello') @section('h1', '丸ごとシマウマ') {{-- コメント。コメント。コメント。 --}} @section('contents') <p>うはははは</p> @endsection
共通テンプレートを組み込みたい
メニューやフッタなどを組み込む
・各ビューで組み込みたいビューを「@include(〇〇〇)」する
・「@include(〇〇〇)」している先で「@section(〇〇〇)」があってもOK。
▼使うファイル
・前述の「resources\views\layout\base.blade.php」「resources\views\layout\base.blade.php」
・新規で「resources\views\layout\navi.blade.php」
▼ベースにするビュー(テンプレート):resources\views\layout\base.blade.php
<!doctype html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>@yield('title')</title> </head> <body> @yield('navi') @yield('h1') @yield('contents') </body> </html>
▼組み込むビュー(テンプレート):resources\views\layout\navi.blade.php
@section('navi') <div>共通のナビメニュー</div> @yield('pageJs') @endsection
▼各ビュー
@extends('layout.base') {{-- ▼layout.base --}} @section('title', 'hello') @section('h1', '丸ごとシマウマ') {{-- ▼layout.navi --}} @section('pageJs') <script src="/js/page.js"></script> @endsection @include('layout.navi')
@componentと$slot
いくつかサイトを見ても意味が分からん。
そのままコピペしてもエラーしか出ないサイトが多すぎる。
他のサイトを見ているとアラート表示を使うときに@componentと$slotを使っているみたい。
▼アラートのビュー:resources\views\common\alert.blade.php
{{ $slot }}
▼各ビュー
@component('common.alert') コンポーネントのテスト本文 @endcomponent
※「common\alert.blade.php」なので「@component('common.alert')」
別の値を渡す
▼アラートのビュー:resources\views\common\alert.blade.php
{{ $title }} {{ $slot }}
▼各ビュー
@component('common.alert') @slot('title') コンポーネントのテストタイトル @endslot コンポーネントのテスト本文 @endcomponent
※「@slot()」で囲まれていないトコが「$slot」になる。
メモ:出力されるHTMLについて
そのまま「@component()」を使ったら希望していないトコに出力された。
▼ベースになるテンプレート
<html> 〇〇〇 </html>
▼$slotのビュー
{{ $slot }}
▼各ビュー
@extends(〇〇〇) @component(〇〇〇) 丸ごとシマウマ @endcomponent
▼出来上がるHTML
丸ごとシマウマ <html> 〇〇〇 </html>
▼希望していたHTML
<html> 丸ごとシマウマ 〇〇〇 </html>
@yield()との組み合わせ
出力したい場所を@yield()で決める。
→もっとスマートなやり方があるハズ。
▼ベースになるテンプレート
<html> @yield('hoge') 〇〇〇 </html>
▼$slotのビュー
{{ $slot }}
▼各ビュー
@extends(〇〇〇) @section('hoge') @component(〇〇〇) 丸ごとシマウマ @endcomponent @endsection
▼出来上がるHTML
<html> 丸ごとシマウマ 〇〇〇 </html>
めも
以下、必要な部分だけ抜き出し。
ベーステンプレートの指定:@extends()
「@extends()」で使いたいベースになるテンプレートを指定。
▼ベースになるテンプレート
<html> <head> </head> <body> </body> </html>
▼各ビュー
@extends(ベースになるテンプレートを指定)
▼出来上がるHTML
<html> <head> </head> <body> </body> </html>
ベースになるテンプレートの指定方法
・「〇〇〇.blade.php」の「〇〇〇」を使う
・「resources\views」の下にフォルダを作っているなら「.」で区切る
PATH | 指定方法 |
---|---|
resources\views\base.blade.php | @extends('base') |
resources\views\common\header.blade.php | @extends('common.header') |
値の表示:@yield()と@section()
「@yield()」を「@section()」で指定した値に置き換える
▼基本
・「@section()」の第2引数で指定
・「@section()」と「@endsection」で囲む
▼ベースになるテンプレート
@yield('hoge')
「@section()」の第2引数で指定:HTMLタグを文字として表示
「@section()」の第2引数を使う
▼各ビュー
@section('hoge', '<b>丸ごとシマウマ</b>')
▼出来上がるHTML
<b>丸ごとシマウマ</b>
※「<b>」が文字列として扱われる
「@section()」と「@endsection」で囲む:HTMLタグをHTMLタグとして表示
「@section()」と「@endsection」で囲む
▼各ビュー
@section('hoge') <b>丸ごとシマウマ</b> @endsection
▼出来上がるHTML
丸ごとシマウマ
※「<b>」がHTMLタグとして扱われる
ベーステンプレートに別のテンプレートを差し込む:@include()
全体のベーステンプレートにとは別にヘッダメニューを差し込みたい
例えば・・・
・「カテゴリーA」に属する各ページと「カテゴリーB」に属する各ページでヘッダメニューを差し替えたい
▼ベースになるテンプレート
<html> <head> </head> <body> @yield('header') </body> </html>
▼「カテゴリーA」用のヘッダメニュー
@section('header') <div>「カテゴリーA」用のヘッダメニュー</div> @endsection
▼「カテゴリーB」用のヘッダメニュー
@section('header') <div>「カテゴリーB」用のヘッダメニュー</div> @endsection
▼「カテゴリーA」に属する各ビュー
@extends(ベースになるテンプレートを指定) @include(「カテゴリーA」用のヘッダメニューを指定)
▼「カテゴリーB」に属する各ビュー
@extends(ベースになるテンプレートを指定) @include(「カテゴリーB」用のヘッダメニューを指定)
▼「カテゴリーA」に属する各ビューで出来上がるHTML
<html> <head> </head> <body> <div>「カテゴリーA」用のヘッダメニュー</div> </body> </html>
▼「カテゴリーB」に属する各ビューで出来上がるHTML
<html> <head> </head> <body> <div>「カテゴリーB」用のヘッダメニュー</div> </body> </html>
差し込むテンプレートに値を表示
「@yield()」と「@section()」を使う
▼「カテゴリーA」用のヘッダメニュー
@section('header') <div>「カテゴリーA」用のヘッダメニュー</div> @yield('hoge') @endsection
▼「カテゴリーA」に属する各ビュー
@extends(ベースになるテンプレートを指定) @include(「カテゴリーA」用のヘッダメニューを指定) @section('hoge', '丸ごとシマウマ')
▼「カテゴリーA」に属する各ビューで出来上がるHTML
<html> <head> </head> <body> <div>「カテゴリーA」用のヘッダメニュー</div> 丸ごとシマウマ </body> </html>
値の追加:@section()~@show、@parent
「@yield()」と「@section()」で置き換えだが
「@section()~@show」と「@parent」で追加が可能
▼ベースになるテンプレート
@section('sub') <div>abc</div> @show
▼各ビュー
@section('sub') @parent <div>123</div> @endsection
▼出来上がるHTML
<div>abc</div> <div>123</div>
@parentが無いときの結果
@section('sub')を置き換える→結果的には「@yield()」と「@section()」の組合せと同じっぽい。
▼各ビュー
@section('sub') <div>123</div> @endsection
▼出来上がるHTML
<div>123</div>