こちらの記事は以下の書籍を参考に執筆しました
#Bladeの構文
レイアウト内でヒョ持したり、レイアウトを継承して複数を組み合わせたりするための構文について。
##値の表示
{{値・変数・式・関数等}}
{{}}はHTMLスケープ処理されるためHTMLタグとしては機能しない。
エスケープ処理してほしくない場合は以下のようにする。
{{!! 値・変数・式・関数等 !!}}
##@ifディレクティブ
Bladeにはディレクティブという言語で言う構文が用意されている。
まずは**条件分岐(if)**に相当するディレクティブから。
###条件がtrueの時に表示する。
@if (条件)
...出力内容...
@endif
####条件によって異なる表示をする
@if (条件)
...出力内容...
@else
...出力内容...
@endif
####複数の条件を設定
@if (条件)
...出力内容...
@endif(条件)
...出力内容...
@else
...出力内容...
@endif(条件)
@ifには**@elseと@elseif**が用意されている
ディレクティブは何かを実行するのではなく表示する。
条件がこれなら表示する、表示しないという動きをする。
##@ifを使ってみる
以下のように修正する
<body>
<h1>Blade/Index</h1>
@if ($msg!='')
<p>こんにちは、{{$msg}}さん。</p>
@else
<p>なにか書いてください</p>
@endif
<form action="/hello" method="post">
@csrf
<input type="text" name="msg">
<input type="submit">
</form>
</body>
次はコントローラを修正
public function index()
{
return view('hello.index', ['msg'=>'']);
}
public function post(Request $request)
{
return view('hello.index', ['msg'=>$request->msg]);
}
/helloにアクセスして正常に表示されているか確認する。
##特殊なディレクティブ
###条件が非成立のときに表示
@unless(条件)
...表示内容...
@endunless
条件がfalseの時に表示をする。
###変数が空の場合に表示
@empty(変数)
...表示内容...
@endempty
###変数が定義済みの場合に表示
@isset(変数)
...表示内容...
@endisset
emptyと似ているが、これは変数そのものが定義されているかどうかを判定する。
##@issetで変数定義をチェックする
@issetを使って例を見てみる。
<body>
<h1>Blade/Index</h1>
@isset ($msg)
<p>こんにちは、{{$msg}}さん。</p>
@else
<p>なにか書いてください</p>
@endisset
<form action="/hello" method="post">
@csrf
<input type="text" name="msg">
<input type="submit">
</form>
</body>
コントローラはこのように
public function index()
{
return view('hello.index');
}
public function post(Request $request)
{
return view('hello.index', ['msg'=>$request->msg]);
}
indexアクションメソッドでは値をテンプレに渡していない。
そのため、テンプレ側では$msgは未定義になる。
##繰り返しのディレクティブ
###forに相当
@for(初期化;条件;後処理)
...繰り返す表示...
#endfor
###foreachに相当
@foreach($配列 as $変数)
...繰り返す表示...
@endforeach
###foreach-elseに相当
@forelse($配列 as $変数)
...繰り返す表示...
@empty
...$変数が空のときの表示...
@endforelse
foreachにelseを追加したもの相当する。
###whileに相当
@while(条件)
...繰り返す処理...
@endwhile
##繰り返しディレクティブを利用する
<body>
<h1>Blade/Index</h1>
<p>@foreachディレクティブの例</p>
<ol>
@foreach($data as $item)
<li>{{$item}}</li>
@endforeach
</ol>
</body>
コントローラ
public function index()
{
$data=['one','two','three','four','five'];
return view('hello.index', ['data'=>$data]);
}
/helloにアクセスするとリストが表示される。
viewメソッドの[data->$data]でdataに$dataを設定してテンプレートに渡している。
##$loopによるループ変数
$loopでループに関する情報が得られる。
プロパティ | 説明 |
---|---|
$loop->index | 現在のインデックス(0から開始) |
$loop->iteration | 現在の繰り返しかず(1から開始) |
$loop->remaining | 後何回繰り返すか(残り回数) |
$loop->count | 繰り返しで使っているあ配列の要素数 |
$loop->first | 最初の繰り返しかどうか(最初ならtrue) |
$loop->last | 最後の繰り返しかどうか(最後ならtrue) |
$loop->depth | 繰り返しのネスト数 |
$loop->parent | ネストしている場合、親送り返しのループ変数を示す。 |
例を見てみる。 |
<body>
<h1>Blade/Index</h1>
<p>@forディレクティブの例</p>
@foreach($data as $item)
@if($loop->first)
<p>データ一覧</p><ul>
@endif
<li>No,{{$loop->iteration}}.{{$item}}</li>
@if($loop->last)
</ul><p>ーーーここまで</p>
@endif
@endforeach
</body>
これで確認できる。
##phpディテクティブについて
phpディレクティブでPHPスクリプトを直接実行できる。
@php
...PHPスクリプト...
@endphp
<body>
<h1>Blade/Index</h1>
<p>@phpディレクティブの例</p>
<ol>
@php
$counter=0;
@endphp
@while($counter<count($data))
<li>{{$data[$counter]}}</li>
@php
$counter++;
@endphp
@endwhile
</ol>
</body>
テンプレに用意する@phpは最小限に、が基本