Laravelで以下のようなURL内の引数に対して
Route::get('/sample/{param1?}/{param2?}', 'Sapmle\SampleController@index')->name('sample.index');
FormRequestの処理を使ってバリデーションを行おうとしたところ、以下のようにいつも通りに書いてもなぜかスルーされてバリデーションが実行されない。
namespace App\Http\Requests\Sample; use Illuminate\Foundation\Http\FormRequest; class SampleRequest extends FormRequest { /** 中省略 */ public function rules() { return [ 'param1' => [ 'integer', ], 'param2' => [ 'string', ], ]; } /** 中省略 */ }
調べたところ、どうやらURL内の引数はルート情報内のみに存在していてそのままではパラメーターとして拾ってくれず、継承元のFormRequestクラスにあるvalidationData()メソッドをオーバーライドして渡し直してあげる必要があるらしい。以下のように上書きメソッドを追記することで通常通り上記のようなrules()で拾うことができた。
namespace App\Http\Requests\Sample; use Illuminate\Foundation\Http\FormRequest; /** ↓↓ Routeを追記 ↓↓ */ use Illuminate\Support\Facades\Route; class SampleRequest extends FormRequest { /** 中省略 */ /** * Override validationData() method in FormRequest to obtain parameters within URL. * * @return array */ public function validationData() { return array_merge($this->request->all(), [ 'param1' => Route::input('param1'), 'param2' => Route::input('param2'), ]); } /** 中省略 */ }