[Laravel]フォームのバリデーションをRequestクラスに分離する

LaraveのバリデーションチェックをRequestクラスの別ファイルにまとめる方法。
すでに各所で解説が書かれているだろうけれど、自分なりに把握出来たのでメモ。

作成

生成

1
$ php artisan make:request HogeRequest

これで、app/Http/Requests/以下に生成される。

デフォルトで生成される内容は以下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class HogeRequest extends Request
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return false;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
        ];
    }
}

認証

一つ目のメソッド、authorizeはデフォルトではfalseとなっている。
これは、このフォームを送信出来るユーザの認証を判定する箇所で、デフォルトのfalseだと全てのユーザが弾かれてしまう。
なのでこれはtrueに変更する。

バリデーションルール

肝心のバリデーションルールは、rules()メソッド内の戻り値として書く。
配列にコントローラーに書いていた時と同じように書く。

例)

1
2
3
4
5
6
7
8
public function rules()
{
    return [
        'LastName' => 'required',
        'FirstName' => 'required',
        'Email' => 'required|email',
    ];
}

項目の名前 (日本語化)

バリデーションルールに引っかかった際に返されるエラーメッセージはデフォルトでは英語になっている。
これを日本語にするには、言語ファイルを用意してやるとよい。
resouces/lang/ja/以下に、validation.phpを置いてやる。
以下が、デフォルトの英語ファイルを日本語訳してくれているもの。
https://gist.github.com/syokunin/b37725686b5baf09255b

しかしこのままだと、項目名についてはnameで指定したもののママになってしまう。
これをカスタムで日本語化するには、さきほど追加した、validation.phpattributesで指定してやる。

例)

1
2
3
4
5
'attributes' => [
    'title' => 'タイトル',
    'body' => '本文',
    'published_at' => '公開日',
],

ここでの設定は全体での適用となるので、一括指定出来る反面、切り分けが出来ない。
これを各フォーム個別の設定としてやるために、先ほどの、Requestクラスに追加してやることが可能。

例)

1
2
3
4
5
6
7
8
9
public function attributes()
{
    return [
        'name'    => 'お名前',
        'email'   => 'メールアドレス',
        'subject' => '件名',
        'content' => '内容',
    ];
}

戻り先

デフォルトの状態では、バリデーションエラーがあった場合は一つ前のページへ自動的に遷移する。
入力 → 確認 という遷移なら、確認に遷移してきた時点でエラーが出ると、一つ前の入力ページへ飛ぶ。

しかし、確認画面を挟むようなフォームの場合、確認画面から完了画面の際にもバリデーションチェックが必要となる。
これがデフォルトのままだと、
確認 → 完了 という遷移となり、エラーが出ると一つ前の確認画面に戻ってしまう。
ここでは入力画面に戻って欲しい。

その場合、Requestクラスで戻り先を指定してやる事が出来る。

1
protected $redirect = 'hoge_input';

変数名で指定の仕方を変えてやることが可能。

  • redirect – URIでの指定
  • redirectRoute – 名前付きルートの名前での指定
  • redirectAction – コントローラーのアクションでの指定

[参考]

完成

最終的に以下のような形とした。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class HogeRequest extends Request
{

    /**
     * 戻り先
     *
     * @var string
     */
    protected $redirect = 'hoge_input';

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * バリデーションルール
     *
     * @return array
     */
    public function rules()
    {
        return [
            'LastName' => 'required',
            'FirstName' => 'required',
            'Email' => 'required|email',
        ];
    }

    /**
     * エラー時に表示する項目名
     *
     * @return array
     */
    public function attributes()
    {
        return [
            'LastName' => '姓',
            'FirstName' => '名',
            'Email' => 'メールアドレス',
        ];
    }

}
   このエントリーをはてなブックマークに追加