LOG

Laravel5 Blade

Bladeのディレクティブまとめ。


@extends

テンプレートを継承する

引数省略可補足
継承するテンプレートString.blade.phpは書かなくて良い
テンプレートに渡す変数Array追加で渡したい変数を連想配列で渡す
マージされる配列Arrayこの配列は「テンプレートに渡す変数」にマージされる
// ----------------------------------------
// parent.blade.php
// ----------------------------------------

<div>
    @yield('sample')
</div>

// ----------------------------------------
// child.blade.php
// ----------------------------------------

@extends('parent')

@section('sample')
    hello!
@stop

// ----------------------------------------
// 結果
// ----------------------------------------
<div>
    hello!
</div>

@yield

セクションのコンテンツを出力する。

引数省略可説明
セクションIDString文字列で指定
デフォルトの値any

@section ~ @section終了ディレクティブ

引数省略可
セクションIDString

セクションへコンテンツを注入する。
コンテンツ注入を停止するディレクティブには何種類かある。

ディレクティブ説明
@endsection注入を停止
@stop注入を停止 (@endsectionのエイリアス)
@show注入を停止し、出力
@overwrite注入を停止し、上書きする
@append追加注入して停止

@overwriteを使った例

@section('sample')
    hello!
@endsection

@section('sample')
    bye!
@endsection

@yield('sample') // hello!

// ↓↓↓↓↓

@section('sample')
    hello!
@endsection

@section('sample')
    bye!
@overwrite

@yield('sample') // bye!

@appendを使った例

@section('sample')
    hello!
@endsection

@section('sample')
    bye!
@endsection

@yield('sample') // hello!

// ↓↓↓↓↓

@section('sample')
    hello!
@endsection

@section('sample')
    bye!
@append

@yield('sample')
// hello!
// bye!

@@parent

親クラスのコンストラクタを呼ぶsuperみたいなもん
親テンプレートのsectionディレクティブに追記する。

# ==============================
# parent.blade.php
# ==============================
@section('cnt')
    hello
@stop

# ==============================
# child.blade.php
# ==============================
@extends('parent')
@section('cnt')
    @@parent
    bye
@stop

# ==============================
# 結果
# ==============================
hello
bye

@include

引数省略可補足
テンプレートのパスString.blade.phpはいらない。ファイル名に.bladeをつけなくても良い
テンプレートに渡す変数Array追加で渡したい変数を連想配列で渡す
マージされる配列Arrayこの配列は「テンプレートに渡す変数」にマージされる

外部テンプレートを読み込み
「include」で呼ばれるテンプレートは「partial」と呼ばれる。
テンプレートがなければエラーになる。

// ----------------------------------------
// page.blade.php
// ----------------------------------------

@include('layout', ['a'=>'A'], ['a'=>'0A','b'=>'B'] )

// ----------------------------------------
// layout.blade.php
// ----------------------------------------

{{$a}}

// ----------------------------------------
// 結果
// ----------------------------------------
A

@includeif

引数省略可補足
テンプレートのパスString.blade.phpはいらない。ファイル名に.bladeをつけなくても良い
テンプレートに渡す変数Array追加で渡したい変数を連想配列で渡す
マージされる配列Arrayこの配列は「テンプレートに渡す変数」にマージされる

外部テンプレートを読み込み
「include」で呼ばれるテンプレートは「partial」と呼ばれる。
テンプレートがなければ何もしない。


if構文

省略
「@if(),@elseif(),@else,@endif」が使える


@unless構文

省略
「@unless(),@endunless()」が使える


@for構文

省略
「@for(),@endfor」が使える


@foreach構文

省略
「@foreach(),@endforeach」が使える


@php ~ @endphp

PHPの処理を行う
1行の場合は「@endphp」を省略できる

@php($a = 10)
{{$b}} // 10

@php
    $b = "B";
    $c = "C";
@endphp
{{$c}} // C

@empty

引数省略可
評価する変数any
@php($a = '')
@if(@empty($a))
    none
@endif

@lang

引数省略可補足
評価する変数String
プレースホルダーの配列Array
言語指定String言語環境を無視して翻訳する

現在の言語環境に基づいた文章を返す。
対応する翻訳文章がない場合、キーが返される

翻訳ファイルは「resources/{lang}/{ファイル名}」に設置する

@lang('messages.welcom')

とした場合、messageがファイル名、welcomeがmessageファイルが返す配列のキーになる。

// ----------------------------------------
// resources/lang/ja/messages.php
// ----------------------------------------

<?php
    return [
        'welcome' => 'ようこそ'
    ]
// ----------------------------------------
// resources/lang/en/messages.php
// ----------------------------------------

<?php
    return [
        'welcome' => 'welcome'
    ];

// ----------------------------------------
// resources/views/test.blade.php
// ----------------------------------------

@php(App::setLocale('ja'))
@lang('messages.welcome')

@php(App::setLocale('en'))
@lang('messages.welcome')

// ----------------------------------------
// 結果
// ----------------------------------------

ようこそwelcome

プレースホルダーを利用する

// ----------------------------------------
// resources/lang/ja/messages.php
// ----------------------------------------

<?php
    return [
        'welcome' => 'ようこそ!:nameさん!'
    ];

// ----------------------------------------
// resources/views/test.blade.php
// ----------------------------------------

@php(App::setLocale('ja'))
@lang('messages.welcome',['name' => 'よこた'])

// ----------------------------------------
// 結果
// ----------------------------------------

ようこそ!よこたさん!

@choice


@break

break文

@for($i = 0,$l = 10; $i<$l; $i++)
    @if($i === 3) @break @endif
    {{$i}}
@endfor

@continue

continue文

@for($i = 0,$l = 10; $i<$l; $i++)
    @if($i % 2) @continue @endif
    {{$i}}
@endfor

@forelse ~ @endforelse

@emptyと合わせて使う事でforeach文でループできない時の処理を追記できる。
@emptyがないとエラーになる。

<?php
  $list = [];
?>

@forelse($list as $data)
  <p>{{$data['name']}}</p>
  @empty
  <p>データがありません</p>
@endforelse

// -----------------------------
// 結果
// -----------------------------
データがありません

ユーザーログインで分岐

@can,@endcan,@cannot,@endcannot,@elsecannot

ユーザーがアプリケーションにログインしているかで処理を行う。
どうやら単純にログインしているかどうかではなく、権限による切り替えもできるような感じ

まだ試していないので、後日追記


@hasSection

指定したセクションを持っていれば処理をする

@section('sample')
  sample section
@stop

@hasSection('sample')
  has section
@else
  has not section
@endif

while構文

省略
「@while(),@endwhile」が使える


@push,@endpush,@stack

sectionディレクティブと同じような感じ?

@section('sec-sample')
    section start |
@stop

@push('push-sample')
    push start |
@endpush

@for($i = 0, $l = 5; $i<$l; $i++)
    @section('sec-sample')
        {{$i}} |
    @append
    @push('push-sample')
        {{$i}} |
    @endpush
@endfor

GO!<br>
-----------<br>
@yield('sec-sample')<br>
@stack('push-sample')<br>

// -------------------------------
// 結果
// -------------------------------

GO!
-----------
section start | 0 | 1 | 2 | 3 | 4 | 
push start | 0 | 1 | 2 | 3 | 4 | 

こんな感じで使ったり?

@for($i = 0, $l = 5; $i<$l; $i++)
    @push('data')
        {{$i}} |
    @endpush
@endfor

@section('list')
    @stack('data')
@stop

GO!<br>
-----------<br>
@yield('list')<br>

// -------------------------------
// 結果
// -------------------------------

GO!
-----------
0 | 1 | 2 | 3 | 4 |
参考
What is the difference between Section and Stack in Blade?

デリミタ

変数を出力したり、コメントアウトするためのデリミタが何種類かある。

デリミタ説明補足
{{$var}}変数の出力変数はエスケープされる
{!$var!}変数の出力変数はエスケープされない
{{– hoge –}}コメントアウト
@{{$var}}処理自体をエスケープ波括弧が表示される

エスケープタグでは三項演算子が使える

<?php
    $a = 1;
    function my_func($bool){
        return $bool ? "hello" : false;
    }
?>
{{ my_func(true) ? my_func(true) : 0 }}  // hello
{{ $a === 2 ? $a : 10 }}                 // 10
{{ isset($a) ? $a : 10 }}                // 1

# issetであれば下記のように省略できる
{{ $a or 10 }}
引用
http://readouble.com/laravel/5/0/0/ja/templates.html