46
39

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-09-20

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

- 目次 -

46
39
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
46
39

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?