2.

Laravel Blade @if 条件分岐の使い方完全ガイド

編集
この記事の要点
  • Blade の条件分岐: @if / @elseif / @else / @endif@unless@empty@isset@switch@auth@guest@can
  • @if は内部的に にコンパイルされる
  • @isset は変数定義 & 非 null チェック、@empty は変数が空 (PHP empty 同じ)
  • @auth / @guest はログイン状態判定、@can("edit", $post) は Gate / Policy 判定
  • 条件付きインクルードは @includeWhen($cond, "view") または @includeIf

基本: @if / @elseif / @else

{{-- 基本形 --}}
@if ($user->age >= 20)
    

成人

@elseif ($user->age >= 13)

未成年 (中高生)

@else

子ども

@endif {{-- コンパイル後は PHP の if --}} age >= 20): ?>

成人

age >= 13): ?>

未成年 (中高生)

子ども

@unless: not の糖衣構文

{{-- @if (!...) と同じ意味 --}}
@unless (Auth::check())
    ログイン
@endunless

{{-- これと等価 --}}
@if (! Auth::check())
    ログイン
@endif

@isset: 変数定義 & 非 null チェック

{{-- 変数が定義されかつ null でないとき --}}
@isset ($user)
    

{{ $user->name }}

@endisset {{-- @isset は内部的に --}}

{{ $user->name }}

{{-- 配列キーの存在チェック --}} @isset ($data['name']) {{ $data['name'] }} @endisset

@empty: 空判定

{{-- PHP の empty() と同じ --}}
@empty ($users)
    

ユーザーは登録されていません

@endempty {{-- @forelse とセットでよく使う --}} @forelse ($users as $user)
  • {{ $user->name }}
  • @empty
  • ユーザーがいません
  • @endforelse

    @auth / @guest: ログイン状態判定

    {{-- ログイン中のみ表示 --}}
    @auth
        

    {{ Auth::user()->name }} さん、こんにちは

    ログアウト @endauth {{-- 未ログインのみ表示 --}} @guest ログイン 新規登録 @endguest {{-- ガード指定 --}} @auth ('admin') 管理画面 @endauth @guest ('api')

    API トークンが必要です

    @endguest

    @can / @cannot: 認可 (Gate / Policy)

    {{-- ユーザーが特定の権限を持つか --}}
    @can ('update', $post)
        編集
    @endcan
    
    @cannot ('delete', $post)
        

    削除権限がありません

    @endcannot {{-- 複数権限のいずれか --}} @canany (['update', 'delete'], $post) @endcanany {{-- これは AuthServiceProvider で定義 --}} {{-- Gate::define('update', fn($user, $post) => $user->id === $post->user_id); --}}

    @switch: 多分岐

    @switch ($status)
        @case ('draft')
            下書き
            @break
    
        @case ('published')
            公開
            @break
    
        @case ('archived')
            アーカイブ
            @break
    
        @default
            不明
    @endswitch

    条件付きクラス: @class

    Laravel 8.51+ で追加された便利ディレクティブ:

    {{-- 条件に応じて class を付与 --}}
    
    $hasError, 'bg-green-100 text-green-800' => $isSuccess, 'opacity-50' => $isDisabled, ])> メッセージ
    {{-- 同様に @style もある --}}
    $important])>...
    {{-- @checked / @selected / @disabled / @readonly --}} agree))>

    条件付きインクルード

    {{-- 条件 true のときだけインクルード --}}
    @includeWhen ($user->isAdmin(), 'admin.menu', ['user' => $user])
    
    {{-- 条件 false のときだけインクルード --}}
    @includeUnless ($user->isAdmin(), 'guest.banner')
    
    {{-- ビューファイルが存在すればインクルード --}}
    @includeIf ('partials.optional-banner')
    
    {{-- 配列の最初に存在するビューをインクルード --}}
    @includeFirst (['custom.header', 'default.header'])

    ネストと組み合わせ例

    @auth
        @if ($user->isAdmin())
            管理
        @elseif ($user->isPaidMember())
            プレミアム機能
            @can ('create', App\Models\Post::class)
                投稿作成
            @endcan
        @else
            プランをアップグレード
        @endif
    @else
        @guest
            ログイン
        @endguest
    @endauth

    ディレクティブ一覧

    ディレクティブ同等の PHP用途
    @if / @endifif {} 真偽判定
    @unless / @endunlessif (!...)否定形
    @isset / @endissetisset()変数定義チェック
    @empty / @endemptyempty()空判定
    @auth / @endauthAuth::check()ログイン中のみ
    @guest / @endguest!Auth::check()未ログインのみ
    @can / @endcanGate::allows()権限あり
    @cannot / @endcannotGate::denies()権限なし
    @switch / @endswitchswitch {}多分岐
    @productionapp()->environment('production')本番のみ
    @env('local')app()->environment('local')環境別

    FAQ

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

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

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

    編集
    Post Share
    子ページ

    子ページはありません

    同階層のページ
    1. 親ビューと子ビュー(@section, @yield, @extends, @parent, @include)
    2. 条件分岐(@if)
    3. 繰り返し(@for, @foreach, @forelse, @while)
    4. 個別のページにcssやjsを反映させる方法