この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:T
更新日時:2026-06-11 07:07:02

タイトル: 条件分岐(@if)
SEOタイトル: Laravel Blade @if 条件分岐の使い方完全ガイド

この本文には実行可能なタグ等が含まれるため、安全のためHTMLソースとして表示しています。本文データは変更していません。

<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse;background:#fffbea;border:1px solid #f4c430;margin:1em 0;width:100%"><tr><td style="background:#f4c430;color:#000;font-weight:bold;padding:8px">この記事の要点</td></tr><tr><td style="padding:10px"><ul><li><strong>Blade の条件分岐</strong>: <code>@if / @elseif / @else / @endif</code>、<code>@unless</code>、<code>@empty</code>、<code>@isset</code>、<code>@switch</code>、<code>@auth</code>、<code>@guest</code>、<code>@can</code></li><li><strong><code>@if</code> は内部的に <code><?php if(...): ?></code></strong> にコンパイルされる</li><li><strong><code>@isset</code></strong> は変数定義 & 非 null チェック、<strong><code>@empty</code></strong> は変数が空 (PHP empty 同じ)</li><li><strong><code>@auth</code> / <code>@guest</code></strong> はログイン状態判定、<strong><code>@can("edit", $post)</code></strong> は Gate / Policy 判定</li><li>条件付きインクルードは <strong><code>@includeWhen($cond, "view")</code></strong> または <code>@includeIf</code></li></ul></td></tr></table>
<h2>基本: @if / @elseif / @else</h2>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-blade">{{-- 基本形 --}}
@if ($user->age >= 20)
    <p>成人</p>
@elseif ($user->age >= 13)
    <p>未成年 (中高生)</p>
@else
    <p>子ども</p>
@endif

{{-- コンパイル後は PHP の if --}}
<?php if ($user->age >= 20): ?>
    <p>成人</p>
<?php elseif ($user->age >= 13): ?>
    <p>未成年 (中高生)</p>
<?php else: ?>
    <p>子ども</p>
<?php endif; ?></code></pre>
<h2>@unless: not の糖衣構文</h2>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-blade">{{-- @if (!...) と同じ意味 --}}
@unless (Auth::check())
    <a href="/login">ログイン</a>
@endunless

{{-- これと等価 --}}
@if (! Auth::check())
    <a href="/login">ログイン</a>
@endif</code></pre>
<h2>@isset: 変数定義 & 非 null チェック</h2>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-blade">{{-- 変数が定義されかつ null でないとき --}}
@isset ($user)
    <p>{{ $user->name }}</p>
@endisset

{{-- @isset は内部的に --}}
<?php if (isset($user)): ?>
    <p>{{ $user->name }}</p>
<?php endif; ?>

{{-- 配列キーの存在チェック --}}
@isset ($data[&apos;name&apos;])
    {{ $data[&apos;name&apos;] }}
@endisset</code></pre>
<h2>@empty: 空判定</h2>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-blade">{{-- PHP の empty() と同じ --}}
@empty ($users)
    <p>ユーザーは登録されていません</p>
@endempty

{{-- @forelse とセットでよく使う --}}
@forelse ($users as $user)
    <li>{{ $user->name }}</li>
@empty
    <li>ユーザーがいません</li>
@endforelse</code></pre>
<h2>@auth / @guest: ログイン状態判定</h2>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-blade">{{-- ログイン中のみ表示 --}}
@auth
    <p>{{ Auth::user()->name }} さん、こんにちは</p>
    <a href="/logout">ログアウト</a>
@endauth

{{-- 未ログインのみ表示 --}}
@guest
    <a href="/login">ログイン</a>
    <a href="/register">新規登録</a>
@endguest

{{-- ガード指定 --}}
@auth (&apos;admin&apos;)
    <a href="/admin">管理画面</a>
@endauth

@guest (&apos;api&apos;)
    <p>API トークンが必要です</p>
@endguest</code></pre>
<h2>@can / @cannot: 認可 (Gate / Policy)</h2>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-blade">{{-- ユーザーが特定の権限を持つか --}}
@can (&apos;update&apos;, $post)
    <a href="/posts/{{ $post->id }}/edit">編集</a>
@endcan

@cannot (&apos;delete&apos;, $post)
    <p>削除権限がありません</p>
@endcannot

{{-- 複数権限のいずれか --}}
@canany ([&apos;update&apos;, &apos;delete&apos;], $post)
    <button>操作メニュー</button>
@endcanany

{{-- これは AuthServiceProvider で定義 --}}
{{-- Gate::define(&apos;update&apos;, fn($user, $post) => $user->id === $post->user_id); --}}</code></pre>
<h2>@switch: 多分岐</h2>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-blade">@switch ($status)
    @case (&apos;draft&apos;)
        <span class="badge gray">下書き</span>
        @break

    @case (&apos;published&apos;)
        <span class="badge green">公開</span>
        @break

    @case (&apos;archived&apos;)
        <span class="badge red">アーカイブ</span>
        @break

    @default
        <span class="badge">不明</span>
@endswitch</code></pre>
<h2>条件付きクラス: @class</h2>

<p>Laravel 8.51+ で追加された便利ディレクティブ:</p>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-blade">{{-- 条件に応じて class を付与 --}}
<div @class([
    &apos;p-4&apos;,
    &apos;bg-red-100 text-red-800&apos; => $hasError,
    &apos;bg-green-100 text-green-800&apos; => $isSuccess,
    &apos;opacity-50&apos; => $isDisabled,
])>
    メッセージ
</div>

{{-- 同様に @style もある --}}
<div @style([&apos;color: red&apos; => $important])>...</div>

{{-- @checked / @selected / @disabled / @readonly --}}
<input type="checkbox" @checked(old(&apos;agree&apos;, $user->agree))>
<option value="JP" @selected($country === &apos;JP&apos;)>日本</option>
<button @disabled($isLoading)>送信</button></code></pre>
<h2>条件付きインクルード</h2>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-blade">{{-- 条件 true のときだけインクルード --}}
@includeWhen ($user->isAdmin(), &apos;admin.menu&apos;, [&apos;user&apos; => $user])

{{-- 条件 false のときだけインクルード --}}
@includeUnless ($user->isAdmin(), &apos;guest.banner&apos;)

{{-- ビューファイルが存在すればインクルード --}}
@includeIf (&apos;partials.optional-banner&apos;)

{{-- 配列の最初に存在するビューをインクルード --}}
@includeFirst ([&apos;custom.header&apos;, &apos;default.header&apos;])</code></pre>
<h2>ネストと組み合わせ例</h2>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-blade">@auth
    @if ($user->isAdmin())
        <a href="/admin">管理</a>
    @elseif ($user->isPaidMember())
        <a href="/premium">プレミアム機能</a>
        @can (&apos;create&apos;, App\Models\Post::class)
            <a href="/posts/create">投稿作成</a>
        @endcan
    @else
        <a href="/upgrade">プランをアップグレード</a>
    @endif
@else
    @guest
        <a href="/login">ログイン</a>
    @endguest
@endauth</code></pre>
<h2>ディレクティブ一覧</h2>

<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse;width:100%">
<thead><tr style="background:#e3f2fd"><th>ディレクティブ</th><th>同等の PHP</th><th>用途</th></tr></thead>
<tbody>
<tr><td><code>@if / @endif</code></td><td><code>if {} </code></td><td>真偽判定</td></tr>
<tr><td><code>@unless / @endunless</code></td><td><code>if (!...)</code></td><td>否定形</td></tr>
<tr><td><code>@isset / @endisset</code></td><td><code>isset()</code></td><td>変数定義チェック</td></tr>
<tr><td><code>@empty / @endempty</code></td><td><code>empty()</code></td><td>空判定</td></tr>
<tr><td><code>@auth / @endauth</code></td><td><code>Auth::check()</code></td><td>ログイン中のみ</td></tr>
<tr><td><code>@guest / @endguest</code></td><td><code>!Auth::check()</code></td><td>未ログインのみ</td></tr>
<tr><td><code>@can / @endcan</code></td><td><code>Gate::allows()</code></td><td>権限あり</td></tr>
<tr><td><code>@cannot / @endcannot</code></td><td><code>Gate::denies()</code></td><td>権限なし</td></tr>
<tr><td><code>@switch / @endswitch</code></td><td><code>switch {}</code></td><td>多分岐</td></tr>
<tr><td><code>@production</code></td><td><code>app()->environment('production')</code></td><td>本番のみ</td></tr>
<tr><td><code>@env('local')</code></td><td><code>app()->environment('local')</code></td><td>環境別</td></tr>
</tbody>
</table>

<h2>FAQ</h2>

<p><strong>Q: <code>@if</code> と <code>{{ ... ? ... : ... }}</code> どちらを使う?</strong><br />
A: ブロック (タグ複数行) は <code>@if</code>、属性値や 1 つの値なら三項演算子 / null 合体演算子 <code>??</code>。</p>

<p><strong>Q: <code>@if(isset($var))</code> と <code>@isset($var)</code> どちらが良い?</strong><br />
A: 短い <code>@isset</code> を推奨。意図が明確で <code>@endisset</code> によりブロック範囲も分かりやすい。</p>

<p><strong>Q: Blade のコンパイル結果を見たい</strong><br />
A: <code>storage/framework/views/</code> に <code>.php</code> ファイルが生成される。<code>php artisan view:clear</code> でクリア。</p>