Laravelのyieldで追加するコンテンツが無い場合、空の状態になってしまいます。
yieldで追加するコンテンツがあるかどうかを調べて、ある場合とない場合で出力するコードを制御してみます。
サンプルコード
head内が共通で各ページ毎にtitle,keywords,descriptionが設定できるになっているサイトがあるとして、そのサイト内でkeywordsとdescriptionが不要になるページがある想定で試してみます。
まずは普通にhead内を共通にしてみます。
app\Http\routes.php
Route::get('/page', function() { return view('page.index'); });
resources\views\layout\common.blade.php
<DOCTYPE HTML> <html lang="ja"> <head> @yield('head') </head> <body> <div class="contents"> @yield('content') </div> </body> </html>
resources\views\layout\head.blade.php
@section('head') <meta charset="UTF-8"> <title>@yield('title') | cly7796.net</title> <meta name="description" itemprop="description" content="@yield('description')"> <meta name="keywords" itemprop="keywords" content="@yield('keywords')"> @endsection
resources\views\page\index.blade.php
@extends('layout.common') @section('title', 'ページタイトル') @section('keywords', 'A,B,C') @section('description', '説明文') @include('layout.head') @section('content') <p>コンテンツ内容</p> @endsection
これで/pageでは以下のコードが出力されました。
HTML
<DOCTYPE HTML> <html lang="ja"> <head> <meta charset="UTF-8"> <title>ページタイトル | cly7796.net</title> <meta name="description" itemprop="description" content="説明文"> <meta name="keywords" itemprop="keywords" content="A,B,C"> </head> <body> <div class="contents"> <p>コンテンツ内容</p> </div> </body> </html>
ページ毎でtitle,keywords,descriptionが設定できます。
keywordsとdescriptionが不要になるページの想定で、keywordsとdescriptionを削除してみます。
resources\views\page\index.blade.php
@extends('layout.common') @section('title', 'ページタイトル') @include('layout.head') @section('content') <p>コンテンツ内容</p> @endsection
以下のようにkeywordsとdescriptionが空の状態でコードが出力されました。
HTML
<DOCTYPE HTML> <html lang="ja"> <head> <meta charset="UTF-8"> <title>ページタイトル | cly7796.net</title> <meta name="description" itemprop="description" content=""> <meta name="keywords" itemprop="keywords" content=""> </head> <body> <div class="contents"> <p>コンテンツ内容</p> </div> </body> </html>
これでも一応問題はなさそうですが、タグ自体を出力しないようにしてみます。
resources\views\layout\head.blade.php
@section('head') <meta charset="UTF-8"> <title>@yield('title') | cly7796.net</title> @if (View::hasSection('description')) <meta name="description" itemprop="description" content="@yield('description')"> @endif @if (View::hasSection('keywords')) <meta name="keywords" itemprop="keywords" content="@yield('keywords')"> @endif @endsection
yieldで追加するコンテンツが無い場合、タグ自体を出力しないようにすることができました。
HTML
<DOCTYPE HTML> <html lang="ja"> <head> <meta charset="UTF-8"> <title>ページタイトル | cly7796.net</title> </head> <body> <div class="contents"> <p>コンテンツ内容</p> </div> </body> </html>
【参考サイト】
コメントが承認されるまで時間がかかります。