Viewの指定方法とBladeの使い方

Viewの指定方法とBladeの使い方(継承、データ表示、制御構文)について解説します。

利用するビューを指定

viewヘルパー関数で利用するビューを指定できます。

return view('greeting', ['name' => 'James']);

Blade操作|継承

Bladeは継承できます。

継承元(layouts.master)

<html>
    <head>
        <title>@yield('title')</title>
        @section('styles')
        <link href="{{ url('css/app.css') }}" rel="stylesheet" type="text/css">        
        @show
    </head>
    <body>
        {{-- サブビュー読み込み --}}
        @include('layouts.header')
 
        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

下記、layouts.masterを継承してみた例です。

@extends('layouts.master')
 
@section('title', 'Page Title')
 
@section('styles')
    @@parent
    <link href="{{ url('css/xxx.css') }}" rel="stylesheet" type="text/css"> 
@endsection
 
@section('content')
    <p>本文コンテンツ</p>
@endsection

Blade操作|データ表示

エスケープ

{{ }}文は、XSS対策としてエスケープしてくれます。

{{ $name }}

エスケープしない

{!! !!}文は、エスケープしません。

{!! $name !!}

デフォルト値を表示

変数が存在しない場合にデフォルト値を表示したい場合、以下のように記述します。

{{ $name or '' }}

改行

改行が含まれる値を表示したいときは、以下のように記述します。

{!! nl2br(e($value)) !!}

コメント

{{-- コメント --}}

Blade操作|制御構文

if文

@if (条件1)
    <!-- 処理1 -->
@elseif (条件2)
    <!-- 処理2 -->
@else
    <!-- 処理3 -->
@endif

for文

@for ($i = 0; $i < 5; $i++)
    {{ $i }}
@endfor

foreach文

@foreach ($users as $user)
    <p>{{ $user->id }}</p>
@endforeach

CSRF対策

csrf_field関数を使うと、CSRF対策用のトークン値を持つフィールドを生成してくれます。

<form method="POST" action="{{ url('login') }}">
    {{ csrf_field() }}
</form>

VerifyCsrfTokenミドルウェア にて、「リクエストのトークン」と「セッションのトークン」が一致するかチェックしてくれます。

複数個所から読み込まれるViewに共通データを渡す

サイドバー上の情報など複数ページで利用されるビューがあります。そういったビューには、毎回データを渡すのではなく、ビューコンポーサーを利用するとよいです。

ビューコンポーサー登録用のサービスプロバイダーを作成

例として、下記のように作成しました。

<?php
 
namespace App\Providers;
 
use Illuminate\Support\ServiceProvider;
use App\Post;
 
class ComposerServiceProvider extends ServiceProvider
{
 
    /**
     * コンテナ結合の登録
     *
     * @return void
     */
    public function boot()
    {
        // クロージャーベースのコンポーサーを登録
        view()->composer('parts.recent_posts', function ($view) {
            $recentPosts = Post::orderBy('created_at', 'desc')
                    ->take(10)
                    ->get();
 
            $view->with('recentPosts', $recentPosts);
        });
    }
 
    /**
     * サービスプロバイダーの登録
     *
     * @return void
     */
    public function register()
    {
        //
    }
 
}

※補足(19~25行目)
クロージャーベースでコンポーサーを登録してます。クラスベースでも登録できます。
(https://readouble.com/laravel/5.1/ja/views.html#view-composersで説明されてます)

ここでは例として、「parts.recent_posts」というビューが呼び出されるときに、「$recentPosts」というデーターを渡しています。

複数ビューにデータを渡したい場合、下記のようにします。

view()->composer(['view1', 'view2'], function ($view) {
 
});

全ビューにデータを渡したい場合、下記のようにします。

view()->composer('*', function ($view) {
 
});

サービスプロバイダーの登録

config/app.php にて、作成したサービスプロバイダーを登録します。

return [
    'providers' => [
 
        // ...
 
        App\Providers\ComposerServiceProvider::class,  // 追加
    ],
];