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, // 追加
],
];