概要
本記事は、PHPフレームワークLaravel入門 第2版で学習している中の疑問・つまづきの備忘録です。
今回はLaravelにおいてRequestで取得できる値の型を変換する必要性についての疑問をまとめます。
今回の疑問
コントローラー内のアクションメソッドで引数として取得できるRequestに含まれるパラメータの型を変換する必要性があるのか、その理由は何か、疑問を持ちました。
詳細はサンプルコードにて記載します。
サンプルコード
このサンプルコードはPHPフレームワークLaravel入門 第2版で用いられていたものです。
今回の疑問はmin変数の初期化に用いている値、$request->input * 1 について、*1しなくても正常に動くにも関わらず、なぜ*1しているのか調査してみました。
なお、ここでの取得している入力項目は年齢です。
public function search(Request $request)
{
//この*1はなぜ必要?
$min = $request->input * 1;
// $min = $request->input; *1しなくても同じ結果を得られた
$max = $min + 10;
$item = Person::ageGreaterThan($min)->ageLessThan($max)->first();
$param = ['input' => $request->input, 'item' => $item];
return view('person.find', $param);
}
試したこと
以下のようにvar_dump()で確認したところ元々取得されるているのはstring型、*1するとint型になっていました。
したがって、年齢をint型に変換したい理由があるということです。
public function search(Request $request)
{
$min = $request->input * 1;
$max = $min + 10;
var_dump($request->input);//////string(2) "30" と出力
var_dump($request->input * 1);//////int(30) と出力
$item = Person::ageGreaterThan($min)->ageLessThan($max)->first();
$param = ['input' => $request->input, 'item' => $item];
return view('person.find', $param);
}
年齢をint型に変換したい理由とは
実験的に以下のようなコードを試してみました。
addToInputメソッドを宣言し、引数をint型に指定しています。
public function search(Request $request)
{
$min = $request->input; ///こちらはエラーが発生する
//$min = $request->input * 1; ///こちらは正常に処理される
$max = $min + 10;
$item = Person::ageGreaterThan($min)->ageLessThan($max)->first();
$param = ['input' => $request->input, 'item' => $item];
return view('person.find', $param);
}
//実験用コード、引数はint
public function addToInput(int $num)
{
return $num * 10;
}
実行したところ、以下のエラーが発生しました。
引数$numはint型でないといけないと怒られています。
再度、最初のサンプルコードに示したように*1したところ、エラーは解消されました。
まとめ
今回$request->input * 1のように年齢をint型に変換しているのは、変数の型を意識して使用することで想定外のエラーを防ぐ目的があると考えられます。
サンプルコードの時点ではたまたまstring型のままでも問題なく動作しましたが、今回実験したaddToInputメソッドのように処理の内容によってはエラーとなる可能性があります。
PHPは型の相互変換ができますが、それに頼りすぎると良くないですね。
開発の際には今使用している値の型は何なのか、意識することが重要です。