Laravelには
- Controllerなどで使う通常のPHPのif文
- blade専用の@を使ったif文
の2種類があります。
ifは、Laravelに限らず、プログラミングのどの言語でも一番使う基礎中の基礎です。
if文は「TOPページでは「ようこそ」と表示したいけど、他のページでは表示したくない」のような条件分岐を付けて、自動的に動かす機能です。
これを使いこなせると、一気にプログラミング自体ができるようになります。
この記事ではLaravelで使うif文2種を実例で1から分かりやすく教えていきます。
if文を理解する事で、Laravelで自分が作りたい機能をどんどん自力で作れるようになりますし、今後他の言語を身につける時も一気に分かるようになりますよ。
Laravel(PHP)での通常のPHPのif文の使い方
まずは通常のif文の使い方を覚えましょう。
これはLaravelに限らず、PHP共通の書き方です。
Laravelでは主にコントローラー上でこの通常のif文を使います。
→LaravelのController.phpとは?初心者向けに図と例でやさしく解説
まず、ifの基本的な書き方なんですが、
こういう形状になってます。
最初の()には、「もし~なら」っていう条件を書いて、{}には、「〇〇する」っていう命令を書きます。
これが基本的な書き方です。
これだけ聞いても、じゃあ、実際どこでどう使うの?ってイメージが湧かないですよね。なので、実例で解説していきます。
if文をController上で使う実例
では、あなたが実戦で使えるように、実例でifの使い方を解説していきます。
まず、あなたが何かサイトに新しい機能を付けたいと思ったら、
それをif文で作れないだろうかと考えます。
例えば、口コミサイトにこういう投稿フォームを作ったとします。
この時、「もしタイトル欄、本文欄、両方とも何も入力してない状態で投稿ボタンを押したら、その時は元のページにリダイレクトしたいな」と考えたとします。
そうしないと、空のデータがそのまま投稿されてしまうからです。
そこでコントローラーにif文を書いて、それを実現できないかと考えて書いてみます。
return redirect( '/create' )->with('status','↓ なんか書いてね');
}
突然すんげぇ難しいの出てきたぞ!って感じたと思いますが、中身の仕組みさえ分かってしまえば、あなたもスラスラ書けるようになります。
まず、条件(もし~なら)部分、
if( !$request->title && !$request->main )
- $request->titleがタイトルの空欄に入力された文字、
- $request->mainが本文欄に入力された文字です。
- ! は「False(ではない)」って意味があり、
- &&は「かつ」って意味があります。
つまり、「タイトルがFalseかつ、本文がFalseなら」って書いてあります。False(正しくない、誤っている)つまり「(本来あるはずの)タイトルがない状態かつ、本文がない状態」とこの場合は捉えられます。
次の{}内の return redirect( '/create' )->with('status','↓ なんか書いてね');
「タイトルも本文もどっちもない状態が」Trueなら(その通りなら)、「/createにリダイレクトしてください」という意味です。投稿ページであるabc.com/createページに戻るって事です。
で、後ろの->withの部分は、メッセージも一緒に送るという事です。つまり、リダイレクトした時に、投稿ページに「↓ なんか書いてね」と表示させるという意味だと思ってください。
実際にコントローラーに書く場合の説明ですが、
public function xxxx(){ } の中に普通にif( ){ }で書けば動きます。上の例だと、「もし空欄だった時はリダイレクトしてね」の条件に引っかからなかったもの、つまりちゃんとフォームに記入された投稿はデータベースに保存されるようになってます。
これが基本のif文です。
自分もそんなに沢山PHPの命令文を覚えてるわけじゃないんだ。毎回ググるんだよ。こういう時はどんな命令文を使えばいいかなとか、「かつ」ってどの記号使うんだっけとか。
何度もif文を作ってるうちに!とか&&みたいなよく使う奴はだんだん覚えてくるから、心配いらないよ。今回も中身は覚えなくていいよ。大事なのは、if( ){ }でどんな事ができるかなっていうのを理解する事だよ。
PHPのif文のelseifとelse
さらにこのif文に条件を加えたい時は、elseif や else を使います。
例えば、今の投稿フォームに
タイトルは入力されたけど、本文が空欄で投稿ボタンを押された場合は、
タイトルをそのまま本文にもコピーしたいなと思ったとします。
こんなふうに↓
もしくは、本文だけ入力された場合も、タイトルにコピーしたいと思ったとしましょう。
この場合の条件分岐は
- 両方空欄なら、リダイレクトバックする
- タイトルだけ記入されてたなら、本文にもコピーして保存する
- 本文だけ記入されたなら、タイトルにもコピーして保存する
- 両方記入されたなら保存する。
っていう分岐を作ればいいわけです。
こういう複数のifが出てくる場合は、elseifやelseを使います。
まずelseやelseifの基本的な書き方ですが、
それがTRUEなら〇〇する
}elseif( もしくは~なら ){
それがTRUEなら〇〇する
}else{
その他の場合は〇〇する
}
こういう書き方になります。
実際にコントローラーに書いた例です。(中身は分からなくて良いので、ifとelseif, elseをどう使ってるかに注目してください。)
こういう状態です↓
それがTrueなら、リダイレクトする
}elseif( もしくはタイトルがFalse ){
それがTrueなら、本文からHTMLタグを取り除いて、30文字切り抜いて、タイトルに代入して保存する
}elseif( もしくは本文がFalse ){
それがTrueならタイトルを本文に代入して保存する
}else{
その他(つまり両方とも記入されてるなら)そのまま保存する
}
これをもっと分かりやすい日本語にするなら、
その通りなら、リダイレクトする
}elseif( もしくはタイトルが無い ){
その通りなら、本文からHTMLタグを取り除いて、30文字切り抜いて、タイトルに代入して保存する
}elseif( もしくは本文が無い ){
その通りなら、タイトルを本文に代入して保存する
}else{
その他(つまり両方とも記入されてるなら)そのまま保存する
}
日本語の「〇〇なら〇〇する」だけで自分が覚えた時、途中で分からなくなった事があるから、わざとTrue,Falseで教えてるんだ。
例えば、!request->title を日本語で直訳した場合、「タイトルではない」という訳になる。でも「タイトルではない」だと、「タイトル以外、例えば本文があればOK」みたいな誤解をしやすい。実際は「タイトルがFalse(正しくない)」という意味なのに。
コンピューターって基本、TrueかFalseかで判断してるから、True or Falseで考える事がプログラミング上達にはすごく重要なんだ。
あとこれ、順番を間違うとうまく行かないんだ。上から必ず順番に処理されていくから、例えば、先に if(!request->title)「タイトルがFalseなら」ってやっちゃうと、両方空欄の時もタイトルは空欄だから当てはまっちゃう。すると間違った処理がされちゃうんだ。
ifに当てはまらなかった場合で「もしくは」を使いたい時はelseif。ifに当てはまらなかった場合の全部を指定したいなら、elseを使うんだ。
ちなみに、今作ったコードですが、3回も「データベースに保存」という同じコードを書いてます。しかしこれ、書き方を変えればもうちょっと短いコードにする事もできます↓
両方空っぽの時とelseで分けてしまい、elseの中にもし「タイトルだけ空なら」「本文だけ空なら」っていうif文を書く事で、いずれにせよ、最後のデータベースに保存が実行されるようになってます。
こうやって繰り返し書く事を少なくする事で、より軽快に動くサイトを作れるようになります。
LaravelのBladeでのif文の書き方
LaravelではBlade専用のif文の書き方があります。というのも、Bladeでは普通のPHPを書かないで、Blade専用のコード(ディレクティブ)を使います。
→Laravelのblade.phpとは?普通のPHPは使える?初心者もよく分かる図と例で解説!
先程までは、
でしたが、bladeでは
@endif
と書きます。
それがTRUEなら〇〇する
}
それがTRUEなら〇〇する
@endif
波括弧がなくなって、代わりに@ifと@endifでサンドイッチする形になってます。
実際にif文をbladeで使ってみよう!
では、またサイトを例に解説していきます。
例えば、「Topページでは、サイト名を<title>タグにしたい。でもその他のページでは投稿タイトルを<title>タグにしたい」とします。
↑TOPだとサイト名が<title>として表示される
↓投稿ページだと、投稿タイトルが<title>として表示される
このタイトルというのは、HTMLの<title></title>タグの内容が表示されてます。
- topなら/ask
- 投稿ページが/ask/123
のようになっているので、後ろに番号がくっつくか、くっつかないかで分岐を作れそうですね。
で、今回はHTML内のタグをPHPで操作したいので、blade.phpファイルに書いていきます。
まず、仮として、こんなふうに作ってみます。
@if (TOPページなら)
<title>Japaslang Ask</title>
@else
<title>{{$val->title}}</title>
@endif
ifの条件がTRUEなら「Japaslang Ask」と表示
else(その他)なら、コントローラーから渡された投稿titleを表示
そう今回、elseやelseifを使う場合は、
@if(条件1なら)
こうしてください。
@elseif(条件2なら)
こうしてください
@else
その他はこうしてください
@endif
こういう書き方になります。
で、「このトップページとそうでない時を分けるのに丁度いいPHP命令文はないかな?」とググって、
こうなりました。\Request::is というのが、呼び出されてるURLの事で、つまりURLが/askと完全一致の時は、Japaslang Askと表示。そうでない時、つまり/ask/123のように、完全一致ではない時は、投稿タイトルを表示というふうに設定し、動くようになりました。
このように、if文は、サイトのページ別に違う表示をさせたい場合や、フォームの入力の有無、チェックボックスがONの時だけメールを送り、OFFの時は送らないなど、あらゆる条件分岐を作る事ができるプログラミングの要です。
自分でも実際にサイトを作りながら、ifでそれを達成できないかを常に考えて実戦してみてくださいね。それだけでどんどん実力が付いていきますよ。
Bladeの中で普通のif文やPHPは使えるのか?
blade.phpの中で普通のPHP if文を無理に使う理由はないですが、
blade専用PHPだけでは対応できない事もあります。
そんな時はbladeに<?php?>タグを使えば、普通のPHPも問題なく使えます。
もしくは、@php ~ @endphpと書いて使う事も可能です。