| この記事の要点 |
|
Laravel におけるページタイトル(HTML の title 要素)の設定方法を説明します。タイトルはブラウザのタブや検索結果に表示される重要な情報なので、ページごとに内容を表す文言にするのが基本です。ここでは汎用的な実装として、「ページ個別タイトル - 共通タイトル」という形のタイトルを作ります。
仕組み: @yield と @section
Blade のテンプレート継承では、共通部分を持つレイアウト(親ビュー)に「差し込み口」として @yield('名前') を置き、各ページの子ビューで @section('名前') 〜 @endsection に中身を書きます。タイトルもこの仕組みで、ページごとの文字列をレイアウトの <title> に流し込みます。
基本の実装例
共通のタイトルを設定(レイアウトに記載)
共通タイトルの前後に差し込み口を 2 つ用意しておくと、前にも後ろにも付け足せます。
<title>@yield('title1')共通タイトル@yield('title2')</title>
ページ個別のタイトルを設定(子ビューに記載)
以下の例は共通タイトルの前に個別タイトルを付け足したいので @section('title1') にしています(後ろに付け足す場合は @section('title2'))。@stop は @endsection と同じ意味です。
@extends('layouts.app')
@section('title1')
ページ個別タイトル -
@stop
@section('content')
...
@endsection
この場合、出力されるタイトルは「ページ個別タイトル - 共通タイトル」になります。
より実用的な書き方
実務では、差し込み口を 1 つにして区切り文字をレイアウト側に持たせると、子ビューが簡潔になります。
レイアウト側
<title>@hasSection('title')@yield('title') - @endif{{ config('app.name') }}</title>
@hasSection は、子ビューでそのセクションが定義されているときだけ中身を出力します。個別タイトルがないトップページでは「 - 」が付かず、アプリ名(.env の APP_NAME)だけになります。
子ビュー側
@extends('layouts.app')
{{-- 固定の文字列 --}}
@section('title', 'お問い合わせ')
{{-- 変数を使う場合(記事詳細ページなど) --}}
{{-- @section('title', $post->title) --}}
@section('content')
...
@endsection
第 2 引数に値を渡す 1 行の書き方では、値は HTML エスケープされて出力されます。ユーザーが入力した記事タイトルなどを使っても安全です。
デフォルトのタイトルを決めておきたいだけなら、@yield('title', 'サイト名') のように第 2 引数で既定値を指定することもできます。
コントローラーからタイトルを渡す方法
タイトルをコントローラー側で組み立てたい場合は、ビューに変数として渡し、子ビューの @section で使います。
// app/Http/Controllers/PostController.php
public function show(Post $post)
{
return view('posts.show', [
'post' => $post,
'title' => $post->title . '(' . $post->category->name . ')',
]);
}
{{-- resources/views/posts/show.blade.php --}}
@extends('layouts.app')
@section('title', $title)
レイアウトで直接 {{ $title ?? '' }} と書く方法もありますが、その場合はすべてのコントローラーで変数を渡すか、未定義時の既定値を必ず書く必要があります。ページごとの責任をはっきりさせるため、@section 経由で渡す形に統一しておくと管理しやすくなります。
コンポーネント型レイアウトの場合
Laravel 7 以降の Blade コンポーネントでレイアウトを作っている場合(<x-app-layout> などで囲む書き方)は、@section ではなく属性やスロットで渡します。
{{-- resources/views/components/layout.blade.php(匿名コンポーネント) --}}
@props(['title' => null])
<title>{{ $title ? $title . ' - ' : '' }}{{ config('app.name') }}</title>
{{-- ページ側 --}}
<x-layout title="お問い合わせ">
...
</x-layout>
スロットで渡す場合は <x-slot name="title">お問い合わせ</x-slot> と書きます。
タイトルを決めるときのポイント
- ページ固有の語を先頭に: 検索結果やタブでは長いタイトルが途中で省略されるため、ページの内容を表す語を前に置き、サイト名は後ろに回します
- 全ページ同じタイトルにしない: 一覧・詳細・フォームなどで同じタイトルが並ぶと、検索エンジンにもユーザーにも区別がつきません
- 区切り文字はサイト内で統一: 「 - 」「 | 」などどれでもよいので、全ページで揃えます
- meta description も同じ方法で:
<meta name="description" content="@yield('description')">のようにレイアウトに置けば、ページごとに説明文を設定できます
確認方法
- ブラウザでページを開き、タブに表示されるタイトルを確認する
- ページのソース表示(Ctrl+U など)で
<title>の中身を確認する。余計な空白や改行が入っていないかもここで分かる - 表示が変わらない場合は
php artisan view:clearでコンパイル済みビューを消してから再読み込みする
関連
- 【Laravel】親ビューと子ビュー(@section, @yield, @extends, @parent, @include)
- HTML title 要素完全ガイド (SEO 観点)
- SEO タイトル設計とキーワード配置完全ガイド
- 【Laravel】個別のページ(Bladeテンプレート)にcssやjsを反映させる方法
子ページはありません
- インストールと設定
- クイックスタート & チュートリアル(初心者向け)
- クイックスタート & チュートリアル(中級者向け)
- ルーティング
- Bladeテンプレート(ビュー/レイアウト)
- コントローラー
- マイグレーションとテーブル定義
- データベースの設定
- Eloquentモデル (ORM)
- SQLとクエリビルダー
- バリデーション
- .envファイルの設定値へのアクセス
- 動作環境による分岐処理
- configフォルダ配下の設定値へのアクセス
- assetヘルパーを利用したpublicフォルダへのアクセス
- storageフォルダへのアクセス
- アプリケーション名の変更
- メンテナンス
- ログイン画面(認証システム)の作成
- ログインの必須化
- ログインユーザー情報の取得
- ルートの認証化
- 本番サーバーへのデプロイ方法
- 多言語化
- csrf_field
- ファイルのダウンロード
- CSVのアップロードおよび読み込み(maatwebsite/excel)
- ページタイトルの設定
- コマンド一覧
- エラー一覧
- SQLの実行ログ出力方法
- キャッシュのクリア
- Selectの結果の最初もしくは最後に任意の値を追加する方法
- ajaxでPOST通信する際の注意点
- ソーシャルログインの実装
- セッション情報の確認
- ログイン、ユーザー登録、パスワードリセット後のリダイレクト先の変更方法
- redirectやreturn viewにメッセージを付与する方法
- クッキー(cookie)の設定と取得
- クラスの再読み込み
- csrfの有効時間を変更する方法
- ViewComposerを用いてviewに共通の値を付与する方法
- View::shareを用いて共通の値を各ビューに渡す方法
- ミドルウェアを用いた処理の共通化
- Middleware内でAuth::check()などを使用する方法
- Controller以外でリダイレクトする方法
- セッションの値の取得/保存/更新/削除
- $requestの値を変更する方法
- 常時SSL化
- ページング(ページネーション)をする方法
- vue.jsとの連携
- Vue.jsと連携するSPA実行環境構築
- .envの値をvue.jsで参照する方法
- vue.jsを本番環境にリリースする方法
- could not find driver(Windows, MySQL編)
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38