Laravel10では、戻り値と引数に型指定が入った状態となります。モデルを指定してコントローラを作成した時も、メソッドの戻り値に型指定が追加されます。
これによって、どんな影響があるんだろう?
これからどうしなきゃいけないの?
という方のために、コントローラのメソッドの戻り値の設定方法や、間違えた型を指定したときの影響、型を指定しなかった場合はどうなるか、分かりやすく解説をしていきます。
今後、Laravelでコードを書く上で役立ててくださいね。
なお今回はコントローラを例にお伝えしますが、Laravel10では、コントローラ以外のファイルにも型指定が追加されています。
★動画編はこちら★
コントローラの戻り値の型ってどんなものがあるの?
コントローラの戻り値の型としては、次のものがよく使われると考えられます。
【コントローラの戻り値の型】
レスポンス型。何らかのレスポンスを返す時に使う。
戻り値の方は、コントローラの各メソッドで、次のように指定します。
コントローラの戻り値の型の指定方法
次に、戻り値の型を使って、どのようにコードを入力するのか、見ていきましょう。
Response型の例
Response型を使う場合には、コントローラの上部に、下記のuse宣言をいれます。
1 |
use Illuminate\Http\Response; |
次のようにコードを入れると、resources/views/welcome.blade.phpファイルを表示できます。
1 2 3 4 |
public function test(): Response { return response()->view('welcome'); } |
responseでは、jsonを返したり、headerを指定したりすることもできます。公式マニュアルに書き方が紹介されています。
RedirectResponse型の例
RedirectResponse型を使う場合には、コントローラの上部に、下記のuse宣言をいれます。
1 |
use Illuminate\Http\RedirectResponse; |
戻り値でRedirectResponse型を使用したいメソッドでは、次のように、コードを書きます。
1 2 3 4 |
public function test(): RedirectResponse { return redirect()->route('welcome'); } |
上記のようにコードを入れると、リダイレクトして、’welcome’という名前のルート設定で指定したファイルを表示できます。
View型の例
View型を使う場合には、コントローラの上部に、下記のuse宣言をいれます。
1 |
use Illuminate\View\View; |
戻り値でView型を使用したいメソッドでは、次のように、コードを書きます。
1 2 3 4 |
public function test(): View { return view('welcome'); } |
上記のようにコードを入れると、resources/views/welcome.blade.phpファイルを表示できます。
2つの型を指定したい場合
メソッドによっては、「ReseponseかRedirectResponseのどちらか」という場合があります。たとえば、下記のような処理を行いたい場合です。
- 管理者だったら編集画面のviewを表示
- 一般ユーザだったらindexにリダイレクトして「編集権限がありません」と表示
そんな場合には、 | で区切って、複数の型を指定できます。
コード例を紹介しますね。まず、use宣言をいれます。
1 2 |
use Illuminate\Http\RedirectResponse; use Illuminate\Http\Response; |
下記のように処理を入れます。
1 2 3 4 5 6 7 8 |
public function test(): Response|RedirectResponse { if (auth()->user()->is_admin()) { return response()->view('post.edit'); } else { return redirect()->route('post.index')->with('error', '編集権限がありません。'); } } |
なぜ戻り値を指定するのか?
なぜ戻り値を指定する必要があるのかですが、これは、不具合を減らすためです。
戻り値を指定しておくと、指定した型と違う戻り値が返されると、エラーになります。たとえば、下記のように、Response型を指定しながら、View型を返していると、エラーになります。
1 2 3 4 |
public function test(): Response { return view('welcome'); } |
【戻り値の型エラーの例】
「Response型でなければいけないのに、View型が返されているよ」
この場合は、responseメソッドを使って、戻り値を指定すると解決できます。
1 2 3 |
public function test(): Response{ return response()->view('welcome'); } |
このようにエラーになってくれることで、開発段階で正しい、つまり想定通りの処理が書かれていることがチェックできます。もしもエラーにならなかった場合、想定とは違う処理を書いたまま気づかず、不具合につながるおそれがあります。
戻り値の型を指定しないとどうなるの?
ちなみに、戻り値を指定しないでメソッドを入れても、特に問題はありません。検証してみましたが、現時点では、普通に処理が行われました。
ただ、モデルを指定してコントローラを作成したりるすと、予め、各メソッドに戻り値が設定された状態でファイルができます。
【モデル名を指定してコントローラを作成した時】
index, create, editといったページを保存するためのメソッドの戻り値には、Response型が設定されます。store、update, destroyといった処理用のメソッドにはRedirectResponse型が設定されます。
Laravel Breezeなどをインストールすると、ユーザー登録ページやログインページが作成されますが、この部分にはView型が設定されます。
おまけ:引数の型指定(タイプヒント)について
なおLaravelでは、モデル名を指定してコントローラを作成すると、引数にも、型が指定されます。こちらは、Laravel9でも搭載されていました。下記の赤丸のような感じで、型が指定されます。
上記のようにすると、$userは、Userモデルの型になります。これによって、Userモデルを通じてusersテーブルから、該当のレコードを取ってきてくれます。なかなか便利な技です。
「そう言われても、どんなふうに使うのかピンとこない」
と思ったら、学習サイト「Laravelの教科書」で、使い方を解説しています。「Laravelの教科書」は、Laravelの使い方を学びつつ、フォーラムサイトを作成していく実践的な教材です。
ご興味あれば、下記ボタンをクリックして、詳細を見てみてくださいね。
基礎編部分は無料です。
さいごに
以上、Laravel10から新たに加わった戻り値の型指定について、コントローラの戻り値の型を使って解説してきました。
Laravel10では、コントローラ以外でも型指定が追加されます。適切に型を指定して、不具合の出にくいWebアプリを開発していきましょう。
追伸:戻り値の型指定は、Laravel10.1ではなくなってました
ご紹介したコントローラ作成時の戻り値の型指定は、Laravel10.1ではなくなってました!
「どうしてそうなったの!?」と思ったら、こちら読んでください。
かなり長いので、まとめますと、こんな感じです。
- 戻り値の型指定に不満が出てくる
- Taylorさん(Laravel作者)が、mixedという型を入れておくことを提案。これなら、void以外、何を入れてもOKな型とのこと
- 賛成の人もいるが、「mixedを入れるなら、そもそも型指定なくてもよいのでは?」という意見も。(わたしもそう思います^^;)
- 意見が色々飛び交う
- 戻り値の型指定をコントローラから取り除くことに決定!
Laravel10.1から、この変更が反映されています。
ひっかきまわされることもありますが、個人的には、変化が速く、ユーザーの意見にも柔軟なLaravelの姿勢が好きです。