この記事では、Laravelのルーティングに用意されているオプションパラメータについて解説します。
ルーティングで「Route::get(‘user/{id?}’, ‘UserController@show’);」などの記述を見たことがあるかと思います。
「{id?}」の部分がどのような意味を持つのか、活用方法を踏まえながら紹介します。
ルーティングのパラメータについて
まずは、ルーティングのパラメータについて簡単に解説します。
Route::get('user/{id}', 'UserController@show');
上記のコードは実際にweb.php内でルーティングを指定する一例です。
「{id}」のところに各ユーザーのidを入れることでユーザーごとのページを表示させることができます。
idによってリクエストが動的に変わります。
しかしルーティングはこの1つで完結させることができ、ユーザーごとのページを表示できます。
- https://test.com/user/1
- https://test.com/user/2
- https://test.com/user/3
上記のようなURLでUserControllerのshowメソッドが動くようになります。
そしてこのパラメータ「{id}」は、必ず入っていないと意図した動作にならない点に注意が必要です。
オプションパラメータ「?」の役割
そこでこの記事の本題である「?」についてです。
Route::get('user/{id?}', 'UserController@show');
先ほどの例からパラメータ部分を「{id?}」に変更しました。
この場合、パラメータ部分の「{id?}」が存在していなくてもこのルーティングが成立します。
つまり、オプションとなって必須ではなくなります。
- https://test.com/user/1
- https://test.com/user/2
- https://test.com/user/3
- https://test.com/user
このように「https://test.com/user」でも同じメソッドが通るようになります。
正規表現でパラメータの値を制限できる
これはオプションパラメータに限った話ではないですが、パラメータの値を正規表現を使って制限することができます。
Route::get('user/{id?}', 'UserController@show')->where(['id' => '[0-9]+']);
whereメソッドを使って「キーにパラメータ名、バリューに正規表現」を配列で指定してあげます。
これでパラメータには数字のみ許可するようになります。
Controllerでパラメータを受け取る
ここまででルーティングでパラメータを指定する方法を紹介してきました。
ここからはController側でパラメータを受け取る方法を紹介します。
Route::get('user/{id?}', 'UserController@show');
先ほどのルーティングのController側を実際に作成してみます。
public function show($id)
{
// 処理内容を書く
}
このように、パラメータ名を引数で受け取るようにします。
パラメータ名をController側メソッドの引数を揃えることが多いです。
別名でも指定可能ですが、可読性の観点から同じ方が良いかと思います。
引数に渡されなかった場合の処理も必要
オプションパラメータのため、パラメータがない場合もshowメソッドに到達します。
なのでその場合の処理も必要になるので注意が必要です。
$idがある場合と無い場合の処理を入れることで予期せぬエラーが回避できます。
以下がその例です。
public function show($id)
{
if ($id) {
$user = User::find($id);
if (!$user) {
return redirect('/')->with('error', 'ユーザーが見つかりません');
}
return view('user.profile', ['user' => $user]);
} else {
// $idが渡されなかった場合
$users = User::all();
return view('user.index', ['users' => $users]);
// 全ユーザーの一覧を表示。
}
}
$idが渡されない場合、全ユーザー一覧を表示する処理を加えています。
引数にデフォルトを明示的にしておくと良い
「$id?」でオプションパラメータの場合、「https://test.com/user」でもshowメソッドに到達しますが、その場合は「$id」にはnullが入ってきます。
そこで、showメソッドの引数にデフォルト値を設定しておくことがおすすめです。
public function show($id = null)
{
if ($id) {
$user = User::find($id);
if (!$user) {
return redirect('/')->with('error', 'ユーザーが見つかりません');
}
return view('user.profile', ['user' => $user]);
} else {
// $idが渡されなかった場合
$users = User::all();
return view('user.index', ['users' => $users]);
// 全ユーザーの一覧を表示。
}
}
こうすることで、パラメータがオプションであることが分かりやすくなります。
他の開発者のためにもデフォルト値を入れてある方が良いかと思います。
パラメータが複数の場合
パラメータが複数の場合は以下のようになります。
Route::get('user/{id?}/{name?}', 'UserController@show');
Controller側は以下のようになります。
public function show($id = null, $name = null)
{
// 具体的な処理内容
}
オプションパラメータが複数になった場合は受け取る引数の数も揃える必要があります。
その際にパラメータと、showメソッドの引数の順番は揃える必要があります。
順番にパラメータを読み込むため入れ替えたりしないようにしましょう。
オプションパラメータを使いこなそう
いかがだったでしょうか。
初めて{id?}などのパラメータを見ると困惑するかもしれませんが、意味が理解できると便利な仕組みだと理解していただけかと思います。
しかし、記事内でも書きましたが、便利で柔軟な仕組みがあるがゆえに読みにくいコードにもなりかねません。
注意点を参考にしていただき、読みやすいコードを目指しましょう。
エンジニアにおすすめ書籍
エンジニアになりたて、これから勉強を深めていきたいという方におすすめの書籍はこちら!