blade上でconfigを使った呼び出し方(2重foreach利用例)


初めに

皆さんこんにちは!
今回は、Laravelのテンプレートエンジンであるbladeに、configファイル内にある定数を呼び出す方法を紹介させていただきます。
ググっても出てこなかった内容だったため、備忘録も兼ねて掲載させていただきます。

是非参考にしてみてください。

bladeとは

公式から抜粋。

BladeはシンプルながらパワフルなLaravelのテンプレートエンジンです。他の人気のあるPHPテンプレートエンジンとは異なり、ビューの中にPHPを直接記述することを許しています。全BladeビューはPHPへコンパイルされ、変更があるまでキャッシュされます。つまりアプリケーションのオーバーヘッドは基本的に0です。Bladeビューには.blade.phpファイル拡張子を付け、通常はresources/viewsディレクトリの中に設置します。

Laravelを実装する際に、viewの部分はhtmlではなくbladeというLaravel固有のテンプレートエンジンを利用します。
書き方自体は、htmlですがhtmlの構文に加えて、Blade固有の機能が使えるようになります。


【条件分岐】
@if(条件式)〜@endif
【ループ処理】
@foreach(条件式)~@endforeach

今回は、blade上で、2重でforeachを利用し、configファイルから定数を出力するやり方の紹介になります。
では参りましょう。

記述の仕方

まずはconfigファイルの定数の紹介になります。
例題として、fruitsの情報が入っているfoods.phpというファイルを作成します。
こちらは、配列で保持しておりcategorykindsでそれぞれ定数を持っています。

今回はこのファイルの情報を2重でforeachを利用し出力してみます。

config/const/foods.php
<?php
  return[
    'FOODS' => [
        'FRUITS' => [
            'category' => 'グレープ',
            'kinds' => [
            'シャインマスカット',
            '巨峰',
            'ピオーネ',
            'デラウエア',
            'その他'
            ]
        ]
     ]
  ];

こちらが出力するためのコードになります。

resources/views/foods.blade.php
@foreach(config('const.foods.FOODS') as $fruit)
<div class="title">{{ Arr::get($fruit, 'category') }}</div>
    @foreach(Arr::get($fruit, 'kinds') as $kind)
    <li>
        <input type="checkbox" id="test-{{$loop->index}}">
        <label for="test-{{$loop->index}}">{{ $kind }}</label>
    </li>
    @endforeach
@endforeach

出力結果

解説

最初のforeach

最初のblade内にあるforeachconfig/const/foods.phpの中にあるFOODSを呼び出しています。
出力方法としては、{{$fruit}}で書きたくなるのですが、エラーが発生します。
想定されるエラーコードは下記です。

TypeError
htmlspecialchars(): Argument #1 ($string) must be of type string, array given

要は型がStringでしか出力できないのに、配列データで来てるよ?違くない?
って言われています。

上記のエラーの通りString型で出力する必要があるので、
{{ Arr::get($fruit, 'category') }}
としてあげて、$fruit内にあるcategoryを指定してあげています。
結果、「グレープ」が出力されます。

2番目のforeach

最初のforeachの中に更にforeachを記述します。
そこで先程も利用したArr::getを再度利用しています。
foreach(Arr::get($fruit, 'kinds') as $kind)
こちらの構文で$fruit内にあるkindsを指定してあげています。

あとは、{{$kind}}と出力すると、上記の出力結果のお出ましです。

最後に

いかがだったでしょうか。
僕は出力がしっかりできるまで数時間を要しました。笑

他にも躓いている方がいるのではないかと思い記述させていただきました。
少しでも役に立てたら幸いです。

ありがとうございました。