PHPフレームワーク「Laravel」ディレクティブ-分岐処理(条件分岐)-
前回はBladeテンプレートを利用する解説を行いました。
Bladeテンプレート内では様々なディレクティブを利用可能となりますが、今回は条件分岐に関するディレクティブを解説します。
PHPの条件分岐について詳しくは「PHP 条件分岐」を参照してください。
ディレクティブとは?
Laravelでのディレクティブとは「@〜」で記述し指定の処理を記述する方法です。
Laravelでは主に「分岐処理を行うディレクティブ」「繰り返しのディレクティブ」「レイアウト作成用ディレクティブ」などがあります。
今回は「分岐処理」のディレクティブについての解説となります。
@if
指定の条件の正誤によって出力内容などを変化させることができます。
「@if」で始まり「@endif」で終了となります。
1 2 3 4 5 6 7 8 9 10 11 12 | <html> <head> <title>ディレクティブ 条件分岐 / Blade</title> </head> <body> <h1>ディレクティブ 条件分岐</h1> @if( false ) <p>TRUE時に表示</p> @endif <p>endif以降</p> </body> </html> |
以下が上記の表示結果です。
@ifの条件が「false」に設定されているので「<p>TRUE時に表示</p>」部分は非表示となっています。
また、「@elseif」「@else」を利用して複数の条件指定し分岐することが可能となっています。
下記のコードは$strに代入された値によって表示を分岐させています。
@ifの条件に当てはまらなければ@elseifの条件を確認、@elseifの条件にも当てはまらなければ@else以降が表示され$strに代入された値を{{$str}}で表示しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <html> <head> <title>ディレクティブ 条件分岐 / Blade</title> </head> <body> <h1>ディレクティブ 条件分岐</h1> @php $str = 'りんご'; @endphp @if( $str == 'みかん' ) <p>$strは「みかん」です。</p> @elseif( $str == 'りんご' ) <p>$strは「りんご」です。</p> @else <p>$strは{{$str}}です。</p> @endunless </body> </html> |
以下が上記の表示結果です。
@ifの使い所
@ifは与えられた変数の内容を確認しそれぞれの条件にあった結果を表示するために利用するのが望ましい利用方法です。
下記は実践的な利用方法として例を挙げてみました。
会員の状態を判別する「$type」の値によって表示する内容を変更しています。
いずれの会員種別にも適合しない場合は「会員登録を行ってください」が表示される仕様となっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <html> <head> <title>ディレクティブ 条件分岐 / Blade</title> </head> <body> <h1>ディレクティブ 条件分岐</h1> @php $arr = [ 1 => '仮会員', 2 => '正会員', 3 => '退会済会員']; $type = 1; @endphp @if( $type == 1 ) <p>現在「{{$arr[$type]}}」本登録をお願いします。</p> @elseif( $type == 2 ) <p>現在「{{$arr[$type]}}」です。</p> @elseif( $type == 3 ) <p>すでに会員を退会しています。</p> @else <p>会員登録を行ってください。</p> @endisset </body> </html> |
@unless
「@if」の逆の振る舞いを行うのが「@unless」です。
指定された条件がfalseの場合、@unless以降が表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <html> <head> <title>ディレクティブ 条件分岐 / Blade</title> </head> <body> <h1>ディレクティブ 条件分岐</h1> @php $str = 'りんご'; @endphp @unless( $str == 'みかん' ) <p>$strは「みかん」ではありません。</p> @else <p>$strは{{$str}}です。</p> @endif </body> </html> |
@empty
渡された値が空の場合に表示を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <html> <head> <title>ディレクティブ 条件分岐 / Blade</title> </head> <body> <h1>ディレクティブ 条件分岐</h1> @php $str = ''; @endphp @empty( $str ) <p>$strは空です</p> @else <p>$strは{{$str}}です。</p> @endempty </body> </html> |
@emptyの注意点
@emptyは渡された値が空の場合、表示されると説明しましたたが、渡された値が「0」や「false」の場合も表示を行います。
以下の2種類のソースは同じ振る舞いをします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <html> <head> <title>ディレクティブ 条件分岐 / Blade</title> </head> <body> <h1>ディレクティブ 条件分岐</h1> @php $str = 0; @endphp @empty( $str ) <p>$strは空です</p> @else <p>$strは{{$str}}です。</p> @endempty </body> </html> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <html> <head> <title>ディレクティブ 条件分岐 / Blade</title> </head> <body> <h1>ディレクティブ 条件分岐</h1> @php $str = false; @endphp @empty( $str ) <p>$strは空です</p> @else <p>$strは{{$str}}です。</p> @endempty </body> </html> |
@isset
「@isset」は「@empty」によく似ていますが、「@isset」は渡された値が未定義もしくはNULL以外の時に表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <html> <head> <title>ディレクティブ 条件分岐 / Blade</title> </head> <body> <h1>ディレクティブ 条件分岐</h1> @php $str = NULL; @endphp @isset( $str ) <p>$strは{{$str}}です</p> @else <p>$strは未定義です。</p> @endisset </body> </html> |
渡された値が「0」や「false」の時の振る舞い
渡された値に「0」「false」が代入されていた場合は下記のような振る舞いを行います。
「0」や「false」は未定義ではなく、変数に値が代入されているためこのような振る舞いとなります。
※@issetがfalseを返すのは未定義かNULLのみです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <html> <head> <title>ディレクティブ 条件分岐 / Blade</title> </head> <body> <h1>ディレクティブ 条件分岐</h1> @php $str = 0; @endphp @isset( $str ) <p>$strは{{$str}}です</p> @else <p>$strは未定義です。</p> @endisset </body> </html> |
@issetの使い所
@issetは指定の変数が定義されているかを確認するため、<form>からの送信内容を判別することに利用することが最適ではないでしょうか。
テンプレートの設定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <html> <head> <title>ディレクティブ 条件分岐 / Blade</title> </head> <body> <h1>ディレクティブ 条件分岐</h1> @isset($msg1) <p>お名前:{{$msg1}}</p> @else <p>お名前を入力してください。</p> @endisset @isset($msg2) <p>フリガナ:{{$msg2}}</p> @else <p>フリガナを入力してください。</p> @endisset @isset($msg3) <p>電話番号:{{$msg3}}</p> @else <p>電話番号を入力してください。</p> @endisset <form method="post" action="/hello"> @csrf <div>お名前:<input type="text" name="msg1"></div> <div>フリガナ:<input type="text" name="msg2"></div> <div>電話番号:<input type="text" name="msg3"></div> <input type="submit" value="送信"> </form> </body> </html> |
コントローラの設定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class HelloController extends Controller { public function index(){ return view( 'hello.index' ); } public function post(Request $request){ $msg1 = $request->msg1; $msg2 = $request->msg2; $msg3 = $request->msg3; $data = [ 'msg1' => $msg1 ,'msg2' => $msg2 ,'msg3' => $msg3 ]; return view( 'hello.index' ,$data ); } } |
初回アクセス時は、アクションのindex()で全ての変数が未定義のため@else以降が表示されます。
フォームからpost送信したいには、入力された内容が変数に格納されるので、格納された内容が表示されます。
フォームが未入力時は変数が未定義となるためこの場合も@else以降が表示されることとなります。
用途にあったディレクティブを利用する
分岐処理(条件分岐)だけをとっても様々なディレクティブが用意されています。
どのディレクティブも同じような振る舞いを行うことは可能ですが、どのディレクティブを利用するかは、変数に代入される値や型、条件などを考慮して選択する必要があります。
S.E->お勧め記事;
- macOS Monterey にアップデート後、composerやhomebrewでenv: php: No such file or directoryが出る
- PHPフレームワーク「Laravel」ディレクティブ-繰り返し処理(ループ処理)-
- XSERVERにSSHを利用してLaravel環境を構築する
- PHPフレームワーク「Laravel」MVCとコントローラを利用する
- PHPフレームワーク「Laravel」PHPテンプレートを利用する
- Laravel開発環境をgitでコミットする際の注意点
- PHPフレームワーク「Laravel」ルーティング Route::get()
- PHPフレームワーク「Laravel」Bladeテンプレートを利用する
- PHP フレームワーク Laravel ディレクティブ – ループ変数 $loop –