bladeテンプレートの継承

Bladeテンプレートの継承


webアプリケーションを作成していると、違う内容のページでもヘッダーやフッターなど共通する部分が出てきます。

1ページずつ全てのページでガリガリコードを書いても実装はできますが、夜中になってしまします。

20ページあるアプリケーションなら20回も書かなければなりません。

ヘッダーのデザインを変えたい時にはまた20回もコードを書き直さなくてはなりません。

それはあまりにもスマートではないので、Blade というテンプレートがLaravelには用意されています。

Blade テンプレートを使って継承すれば、簡単に複数ページに同じデザインを実装できる上、変更の際もテンプレートを変更すれば全てのペ
ージに適応されるためとても便利な機能です。

layout を作成してみよう


mkdir resources/views/layouts

まずはresources/view配下にlayouts という名前でディレクトリを作成します。

layouts ディレクトリ配下に layout.blade.php という名前のファイルを作成して下さい。

ソースコードは以下にしておきます。

長いですが、ここはコピペしないことを推奨します。

<!DOCTYPE html>
<html lang="{{ app()->getLocale() }}">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        
        <meta name="csrf-token" content="{{ csrf_token() }}">

        <title>@yield('title')</title>

         {{-- Laravel標準で用意されているJavascriptを読み込みます --}}
        <script src="{{ asset('js/app.js') }}" defer></script>

        <link rel="dns-prefetch" href="https://fonts.gstatic.com">
        <link href="https://fonts.googleapis.com/css?family=Raleway:300,400,600" rel="stylesheet" type="text/css">

        {{-- Laravel標準で用意されているCSSを読み込みます --}}
        <link href="{{ asset('css/app.css') }}" rel="stylesheet">
        {{-- この章の後半で作成するCSSを読み込みます --}}
        <link href="{{ asset('css/admin.css') }}" rel="stylesheet">
    </head>
    <body>
        <div id="app">
            {{--ナビゲーションバーです。 --}}
            <nav class="navbar navbar-expand-md navbar-dark navbar-laravel">
                <div class="container">
                    <a class="navbar-brand" href="{{ url('/') }}">
                        {{ config('app.name', 'Laravel') }}
                    </a>
                    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                        <span class="navbar-toggler-icon"></span>
                    </button>

                    <div class="collapse navbar-collapse" id="navbarSupportedContent">
                        <!-- Left Side Of Navbar -->
                        <ul class="navbar-nav mr-auto">

                        </ul>

                        <!-- Right Side Of Navbar -->
                        <ul class="navbar-nav ml-auto">
                        </ul>
                    </div>
                </div>
            </nav>

            <main class="py-4">
                @yield('content')
            </main>
        </div>
    </body>
</html>

 

 

@yield('title')

ヘッダーやフッターなど同じデザインのところは継承しますが、各ページごとにタイトルやメインの部分は異なります。

@yield を使うとそこだけ開けておくことができますので、ここはそれぞれのviewで埋め込む形になります。

create.blade.php を以下のように編集してください。

{{-- layouts/layout.blade.phpを読み込む --}}
@extends('layouts.layout')


{{-- layout.blade.phpの@yield('title')に'todoの新規作成'を埋め込む --}}
@section('title', 'todoの新規作成')

{{-- layout.blade.phpの@yield('content')に以下のタグを埋め込む --}}
@section('content')
    <div class="container">
        <div class="row">
            <div class="col-md-8 mx-auto">
                <h2>todo新規作成</h2>
            </div>
        </div>
    </div>
@endsection

@extends('layouts.layout')

extends は簡単に言うとviewファイルを読み込むメソッドになります。

ここでは先ほど作成した、layoutsディレクトリ配下のlayout.blade.php と言うファイルを読み込んでいます。

@section(‘title’, ‘todoの新規作成’)の意味について

@section を使うことで、先ほど@yield で空けておいたtitleに todoの新規作成 と言う文字列をセットしています。

カテゴリー

アーカイブ

Close Bitnami banner
Bitnami