2022年09月16日
前回の記事でログイン画面はわかったのですが、コンテンツの部分をどのテンプレートから持ってきているのかがわかりませんでした。app.blade.phpの中で@sectionと@yieldの部分で@yield(‘content’)とあり、contentと名前のついたテンプレートがあるのかな?と思ったのですがありませんでした。
一体何を参照しているのか、流れを整理しながら探していきたいと思います。
まずhttp://127.0.0.1:8000/
にアクセスすると、routes/web.php
にアクセスしresouces/views/auth/login.blade.php
のデータにアクセスします。Controllerは特になし。
login.blade.php
を見てみると、最初にviews/layouts/app.blade.php
を拡張するという意味と思われる@extends('layouts.app')
と書いてあります。普通にphpで組んでいるとベースになるレイアウトファイルに別のファイルをインクルードする形を取りますが、コードの可読性を考えてか従来インクルードするファイルにベースファイルの拡張であることを表記しているようですね。
そしてその下に気になっていた@section('content')
の表記。要はappのレイアウトファイルにlogin.blade.php
のファイル内の内容で拡張しますよという命令ですね。これはLaravelならではの表現な気がしますね…
ログインフォームのpost先が/home
になっているので、ログインするとふたたびroutes/web.php
にhomeのテンプレートを使用するという情報とpostした情報が転送されます。
web.phpに今度は下のように表記されています(auth認証コマンドを実行したときに増えていたみたいです)
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
homeがgetで送信されてきたとき、App\Http\Controllers\HomeController.phpのindex
のメソッドを使用するという命令ですね。見てみましょう。
public function index()
{
return view('home');
}
indexメソッドを見てみると、homeのviewファイルを使うとなっています。ここでresources/views/home.blade.phpを見てみます。
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">{{ __('Dashboard') }}</div>
<div class="card-body">
@if (session('status'))
<div class="alert alert-success" role="alert">
{{ session('status') }}
</div>
@endif
{{ __('You are logged in!') }}
</div>
</div>
</div>
</div>
</div>
@endsection
resources/views/layouts/app.php
の拡張で、@yield('content')
の部分に@section('content')
の部分を使用するという命令になりますね。実際のログイン後の画面を確認すると、
homeのviewファイルの@sectionの部分がメインコンテンツ部分に表示されています。
それはわかったのですが、session('status')
…これはなんだ…?
今回は共通部分と差し替え部分のテンプレートの構文@yieldと@sectionを順番に調べていきました。
最後にまた意味不明なものが出てきたので次回はそれを調べてみたいと思います。たぶんsessionの配列にstatusって項目があって、それがある場合はそれを表示するって意味だとは思うのだけど、いろいろやっても何も出てこない…
お仕事のご依頼やご相談、弊社サービス内容に関してなど、お気軽にご相談ください。