2016-03-29

【Blade】Laravelテンプレートの便利な書き方

昨日RedditのPHP板でテンプレートエンジンの話が出ていて興味をもったので、この際、Laravelのテンプレートエンジン「Blade」でできる便利な書き方を(@extends@sectionなどのメインは省いて)3つまとめてみました。




 1.「or」でチェックを省略ができる

もし変数に何も入っていない可能性がある場合、Blade内でPHP記法を使うと以下のようになります。
@if(isset($test))
    {{ $test }}
@else
    変数の中身がありません。
@endif
どの言語でもおなじみの if文ですね。
でもBladeを使うと上の5行がたった1行でできるようになります。
それが「or」です。
{{ $test or '変数の中身がありません。' }}
どうでしょう。
三項演算子を使うと1行でも書けなくはないですが、おそらくこちらの方がデザイン担当の人が見てもわかりやすいんじゃないでしょうか。
もちろん以下のようにいろんな変数名を指定できます。
{{ $blog->title or 'Default' }}


2.「forelse」でもチェックを省略できる

PHPで配列をひとつずつ取り出して計算をする際には for や foreach を使うと思います。
Blade でもこのループの書き方は同じで以下のようになります。
@if($posts->count() > 0)
    @foreach($posts as $post)
        {{ $post->title }}
    @endforeach
@else
    データが見つかりませんでした。
@endif
このケースではDBからデータを取得しているので count() を使ってデータが入っているのかをチェックしています。
なんだか少しゴチャゴチャしていますね。

これがBladeでは以下のように書くこともできます。
@forelse($posts as $post)
    {{ $post->title }}
@empty
    データが見つかりませんでした。
@endforelse
表示がスッキリしました。
「できるだけエラーを出さないためにはできるだけコードを書かないこと」という原則を考えるならこちらの方が断然方がいいですね。
もちろん、 foreach と 同じく、以下のようにインデックスも取得できます。
@forelse($posts as $index => $post)


3.各言語を呼び出す

これは日本語圏の環境では利用する機会は少ないかもしれませんが、翻訳された単語を取得する際、より省略した記述をすることができます。
Laravelでは trans() もしくは Lang::get() という2つの取得法があるため通常は以下のようになります。
{{ trans('validation.accepted') }}
{{ Lang::get('validation.accepted') }}

これがBladeではこう書くことができます。
@lang('validation.accepted')
文字数的にはそこまで差はありませんが、横のヒゲがなくなっているので可読性は上がっていると思います。

以上、短いですがBladeの便利な書き方でした。
ちなみに最近は Twig (←小枝という意味みたいです)という高機能なテンプレートエンジンも人気があるようですが、どうやらPHPのコードを直接追加できならしく、またBladeの方が軽いらしいので、私の場合はもし採用するとしてももう少し先になるかなーと思いました。

(それにしても、PhpStormから直接貼り付けるとコード部分が楽に作成できていいですね。^^)



0 件のコメント:

コメントを投稿