URLに指定した値をバリデーションしてくれない!?
フォームリクエストバリデーションについては Laravel 5.4 バリデーション を参照してもらうとして、
例えば routes/web.php に
Route::get('/foo/{id}', 'foo@baa');
と書いておくと
class foo extends Controller {
:
public function baa($id)
{
の様に受け取れるが、
これにフォームリクエストを追加した場合
class foo extends Controller {
:
public function baa(CustomRequest $request, $id)
{
rule() を記述しても id のバリデーションは行われない。
心情としては \$id のバリデーションも CustomRequest で一括してやりたい。
推察
フォームリクエストのルールは $request に含まれているものに反応する。
上記の \$id の様に URL に直接指定した値は、上記の配列に含まれないので評価されない。
解決方法
validationData 関数を使用する。
フォームリクエスト内で \$this->id の様に変数名を直接指定した場合は値が取得できるので、リクエスト配列の後ろに値をマージしてやる。
これで通常の rule() で評価できるようになる。
/**
* ルート引数は対象にならないのでマージする
* @return 配列
*/
protected function validationData()
{
return array_merge($this->request->all(), [
'id' => $this->id,
]);
}