はじめに
突然ですが、みなさんは「@include」と「@extends」の違いを説明できるでしょうか?
Laravelだとbladeファイルの読み込みシーンで頻出ですよね。
自分はなんとなく「どちらもビューを読み込めるが、@includeは引数が渡せて@extendsは渡せない」ぐらいの理解しかなく、危機感を感じたので少しまとめてみます。
前提(環境)
Laravel 9.52.16
先に結論
- 「@extends」は共有レイアウトを読み込む時に使う
- 「@include」は別のビューからBladeビューを読み込む時に使う
以下Laravelの公式ドキュメントを参照しながら解説していきます。
@extendsとは?
「このレイアウトをまた書くのは面倒くさいなあ…」という時に便利なのが@extendsです。
@extendsを使うと、一つのレイアウトをビューファイルとして他のビューにも読み込んで使えます。
<html>
<head>
<title>アプリの名前</title>
</head>
<body>
<div class = "container">
@yield('content')
</div>
</body>
</html>
上のように、使い回したいレイアウトファイルが存在するとします。
このレイアウトを他のビューでも使いたい時に、Bladeファイル内冒頭で@extendsを使います。
そしてapp.blade.php内に「@yield('content')」とあります。
この@yield'〇〇'の部分にビューファイルのセクション名を書くと、その内容をレイアウトへ表示できます。
@extends('layouts.app')
@section('content')
<p>このsectionがyieldに対応している</p>
@endsection
つまり、@extendsはアプリケーションのレイアウト(親ページ)を、他のビューファイル(子ページ)に継承するために使われます。
そして、一般的に親ビューは@yieldセクションを持ちます。
@includeとは
対して@includeは、共通の部品(ナビゲーションバーなど)を他のビューで再利用したいときに使います。
そして子ビューは、@includeされる親ビューで使用できるすべての変数にアクセスできます。
@extends('layouts.app')
@section('content')
<div class="sm:grid sm:grid-cols-3 sm:gap-10">
{{-- ユーザ情報を表示するビューファイルを読み込む --}}
@include('users.card')
</div>
@endsection
「親ビューで使用できるすべての変数にアクセスできる」とは、コントローラから親ビューに渡される$userといった変数を、
@includeで継承される子ビューも使用できることを意味します。
まとめ
使い回したいレイアウト(親ビュー)を継承したいときは@extendsを使います。
そして@extendsで継承される子ビューのセクションは、親ビューの@yieldを使ってレイアウトに表示できます。
共通レイアウト以外の他のビューを部品として読み込みたいときは@includeを使います。
そして@includeの場合、親ビューが使えるすべての変数にアクセスできます。