Laravelの画面開発をするとき、「各画面に同じことを記述しているな」「1カ所に集約できないかな」と考えることがあると思います。そのときは、 resources/views/layouts
の中のファイルを更新することで、1カ所に記述すれば全体が更新されるような仕組みを作ることができます。
今日は、layoutsの修正が反映されなくて時間を溶かしたお話しです。
今回使うのは、この resources/views/layouts/admin/app.blade.php
ファイルです
@extends('adminlte::page')
{{-- Extend and customize the browser title --}}
@section('title')
{{ config('adminlte.title') }}
@hasSection('subtitle') | @yield('subtitle') @endif
@stop
{{-- Extend and customize the page content header --}}
@section('content_header')
@hasSection('content_header_title')
<h1 class="text-muted">
@yield('content_header_title')
@hasSection('content_header_subtitle')
<small class="text-dark">
<i class="fas fa-xs fa-angle-right text-muted"></i>
@yield('content_header_subtitle')
</small>
@endif
</h1>
@endif
@stop
{{-- Rename section content to content_body --}}
@section('content')
@yield('content_body')
@stop
{{-- Create a common footer --}}
@section('footer')
<div class="float-right">
Version: {{ config('app.version', '1.0.0') }}
</div>
@stop
{{-- Add common Javascript/Jquery code --}}
@push('js')
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script src="{{ asset('admin/js/script.js') }}" type="text/javascript"></script>
@endpush
{{-- Add common CSS customizations --}}
@push('css')
<style type="text/css">
.breadcrumb {
background-color: transparent !important;
}
</style>
@endpush
とあるページでこのようにメッセージ出力をコーディングしていました
@extends('layouts.admin.app')
@section('content')
{{-- フラッシュメッセージ --}}
@if (session('flash_message'))
<div class="alert alert-info mt-3" role="alert" id="flash-message">
{{ session('flash_message') }}
</div>
@endif
<div class="container-fluid">
<div class="row">
<div class="col-md-6 mb-2">
<h2>投稿履歴</h2>
</div>
<div class="col-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="/mypage">マイページ</a></li>
<li class="breadcrumb-item active">投稿履歴</li>
</ol>
</div>
</div>
</div>
<div class="container-fluid mt-3">
<div class="row">
<div class="col-md-2">
{{ $posts->links() }}
</div>
<div class="col-md-10">
<a class="btn btn-sm btn-primary ml-2 float-sm-right" href="{{ route('post_create') }}" role="button">新規登録</a>
</div>
</div>
以下略
このページと同じように、 admin の各ページは、それぞれ、 session('flash_message')
を呼び出す記述がありました。そこで、フラッシュメッセージを1カ所書くだけにして、各ページの記述は消すことにしました。幸い、idが設定されていますし、色も同じclassが指定されていたので1カ所にすることができます!
layouts/admin/app.blade.php
を以下のように直しました
@extends('adminlte::page')
{{-- Extend and customize the browser title --}}
@section('title')
{{ config('adminlte.title') }}
@hasSection('subtitle') | @yield('subtitle') @endif
@stop
{{-- Extend and customize the page content header --}}
@section('content_header')
@hasSection('content_header_title')
<h1 class="text-muted">
@yield('content_header_title')
@hasSection('content_header_subtitle')
<small class="text-dark">
<i class="fas fa-xs fa-angle-right text-muted"></i>
@yield('content_header_subtitle')
</small>
@endif
</h1>
@endif
@stop
{{-- Rename section content to content_body --}}
@section('content')
{{-- フラッシュメッセージ --}}
@if (session('flash_message'))
<div class="alert alert-info mt-3" role="alert" id="flash-message">
{{ session('flash_message') }}
</div>
@endif
@yield('content_body')
@stop
{{-- Create a common footer --}}
@section('footer')
<div class="float-right">
Version: {{ config('app.version', '1.0.0') }}
</div>
@stop
{{-- Add common Javascript/Jquery code --}}
@push('js')
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script src="{{ asset('admin/js/script.js') }}" type="text/javascript"></script>
@endpush
{{-- Add common CSS customizations --}}
@push('css')
<style type="text/css">
.breadcrumb {
background-color: transparent !important;
}
</style>
@endpush
これで1カ所に集約されました。そしてこちらは削除します。
@extends('layouts.admin.app')
@section('content')
<!-- ここにあったフラッシュメッセージを削除しました -->
<div class="container-fluid">
<div class="row">
<div class="col-md-6 mb-2">
<h2>投稿履歴</h2>
</div>
<div class="col-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="/mypage">マイページ</a></li>
<li class="breadcrumb-item active">投稿履歴</li>
</ol>
</div>
</div>
</div>
<div class="container-fluid mt-3">
<div class="row">
<div class="col-md-2">
{{ $posts->links() }}
</div>
<div class="col-md-10">
<a class="btn btn-sm btn-primary ml-2 float-sm-right" href="{{ route('post_create') }}" role="button">新規登録</a>
</div>
</div>
以下略
これで完了です。
しかし!!これだと、フラッシュメッセージは出力されませんでした。なぜでしょうか?
{{ シンキングタイム: 5分 }}
答えは下です(^^)
はい、答えは、ページの方の領域指定が @section('content')
となっていたからですね(^^)/
わかれば簡単です。本当は @section('content_body')
としないといけませんでした。
これを検証するためには、とりあえず layouts/admin/app.blade.php
のいろんなところにテキストを表示してみます。
@extends('adminlte::page')
{{-- Extend and customize the browser title --}}
@section('title')
あああ{{ config('adminlte.title') }}
@hasSection('subtitle') | @yield('subtitle') @endif
@stop
{{-- Extend and customize the page content header --}}
@section('content_header')
いいい
@hasSection('content_header_title')
ううう
<h1 class="text-muted">
@yield('content_header_title')
えええ
@hasSection('content_header_subtitle')
おおお
<small class="text-dark">
<i class="fas fa-xs fa-angle-right text-muted"></i>
@yield('content_header_subtitle')
</small>
@endif
</h1>
@endif
@stop
{{-- Rename section content to content_body --}}
@section('content')
かかか
{{-- フラッシュメッセージ --}}
@if (session('flash_message'))
ききき
<div class="alert alert-info mt-3" role="alert" id="flash-message">
{{ session('flash_message') }}
</div>
@endif
くくく
@yield('content_body')
@stop
{{-- Create a common footer --}}
@section('footer')
けけけ
<div class="float-right">
Version: {{ config('app.version', '1.0.0') }}
</div>
@stop
{{-- Add common Javascript/Jquery code --}}
@push('js')
こここ
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script src="{{ asset('admin/js/script.js') }}" type="text/javascript"></script>
@endpush
{{-- Add common CSS customizations --}}
@push('css')
さささ
<style type="text/css">
.breadcrumb {
background-color: transparent !important;
}
</style>
@endpush
これを実行すると、「かかか」と「くくく」は表示されません。「こここ」「さささ」はHTMLを直接確認すると見れました。ということは、呼び出しが間違っていると気づくと思います!(^^)/
エラーの確認のときは、こういう泥臭いやり方は、手っ取り早いし、簡単に思いつくので、原因を絞り込むのにとってもいいですね!
凡ミスに時間がどろっどろに溶かされないように、手っ取り早くトラブルの切り分けができる方法をいくつか覚えておくといいと思います!
正解はこちら
@extends('layouts.admin.app')
@section('content_body')
<div class="container-fluid">
<div class="row">
<div class="col-md-6 mb-2">
<h2>投稿履歴</h2>
</div>
<div class="col-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="/mypage">マイページ</a></li>
<li class="breadcrumb-item active">投稿履歴</li>
</ol>
</div>
</div>
</div>
<div class="container-fluid mt-3">
<div class="row">
<div class="col-md-2">
{{ $posts->links() }}
</div>
<div class="col-md-10">
<a class="btn btn-sm btn-primary ml-2 float-sm-right" href="{{ route('post_create') }}" role="button">新規登録</a>
</div>
</div>
以下略