@foreach
ディレクティブの使い方
Laravel で Blade ファイルを編集するときにお世話になる @foreach ディレクティブ
。コントローラから、記事情報を受け取って、Blade ファイル内で記事情報の展開をする際などに使用されます。例えば、以下のようなコードです。
<div class="article-box">
@foreach( $articles as $article )
<div class="card">
<h3>{{ $article->title }}</h3>
<p>{{ $article->content }}</p>
<small>{{ $article->author }}</small>
</div>
@endforeach
</div>
このように、@foreach
は コントローラから受け取った記事情報 $articles
を反復処理して使用できるように、1記事あたりの情報を、$article
としてループさせています。
とても便利な @foreach
ディレクティブですが、少々弱点もあります。例えば、コントローラから受け取った $articles 内に、何も記事情報がなかった場合はどうでしょうか? その場合、@foreach
内にネストされたコードは実行されません(記事情報がないのですから当たり前と言ってしまえば当たり前です)。
記事情報が出力されない場合($articles に記事情報がなかった場合)に備えて、@foreach
ディレクティブを使用する際は、一緒に @if
ディレクティブを使用することをお勧めします。例えば、上記のコードを参考にするのであれば、記事情報がない場合に備えて以下のようにコードを記述します。
<div class="article-box">
// 記事情報があった場合
@foreach( $articles as $article )
<div class="card">
<h3>{{ $article->title }}</h3>
<p>{{ $article->content }}</p>
<small>{{ $article->author }}</small>
</div>
@endforeach
// 記事情報がなかった場合
@if( $articles->isEmpty() )
<p>No articles</p>
@endif
</div>
このように、$articles
に記事情報がない場合でも、@if
の判定により、<p>No articles</p>
とブラウザに出力され、Webサイトの利用者は、「記事がないんだな」と理解することができますね。
@forelse
ディレクティブをお勧めする理由
・・・という感じで、@foreach
の使い方について説明してきましたが、この @foreach と @if の組み合わせ
を更に簡単、便利にした @forelse
ディレクティブがあるのでご紹介したいと思います。使い方は簡単で、例として以下のコードをご覧ください。
<div class="article-box">
@forelse( $articles as $article )
<div class="card">
<h3>{{ $article->title }}</h3>
<p>{{ $article->content }}</p>
<small>{{ $article->author }}</small>
</div>
@empty
<p>No articles</p>
@endforelse
</div>
この @forelse
ディレクティブは、もしも $articles
の情報がない場合に備えて、@empty
ディレクティブ以下に、記事情報がない場合に表示されるコードを記述できます。今回の例では、@empty
と @endforelse
の間の <p>No articles</p>
が記事情報のない場合に出力されます。
このように、@forelse
と @foreach
を比較してみると、@forelse
のほうがスッキリして見えてきませんでしょうか?
本記事で解説した例のコードでは、@foreach
でも @forelse
でも、出力される内容は変わりません。しかし、コードが見やすくする目的で @forelse
を使用することをお勧めできれば良いなと思います。