laravel
バリデーション
url引数
フォームリクエスト

【Laravel】URLに指定したidなどをフォームリクエストでバリデーションする方法

More than 1 year has passed since last update.

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,
        ]);
    }