Laravel 5.7 フォームリクエストバリデーション( FormRequest )

メモ:

Validation を Controller から追い出し、Validation 処理を含んだリクエストクラス( FormRequest )を用意し処理をさせます。

これにより、 Controller の記述量を減らすことができ、 Validation の処理も別のファイルで管理することができるため、役割を分けシンプルに記述することが可能になります。

FormRequestを作成

コントローラーからバリデーション処理を追い出すため、 FormRequest を作成します。

$ php artisan make:request ContactRequest

コマンドを実行すると、 app\Http ディレクトリに Requests ディレクトリが作成され ContactRequest.php ( FormRequest を継承した ContactRequest クラス)が作成されます。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ContactRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;  // [falseからtrueへ変更]
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'email' => 'required|email',
            'subject' => 'required|max:255',
            'message' => 'required',
        ];
    }
}

authorize メソッドでは、リクエストされた処理を実行する権限があるか確認する処理を記述することができます。

true を返せば、処理が可能(認可された)と判断されます。ここでは、リクエストに対する認可が必要ないため常に true を返しています。

rules メソッドには、バリデーションルールを記述します。

コントローラの作成

FormRequest を用意したので、 コントローラーからバリデーション処理を削除します。作成した FormRequest が参照できるように use App\Http\Requests\ContactRequest; を追加します。

<?php

namespace App\Http\Controllers;

use App\Mail\Contact;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use App\Http\Requests\ContactRequest;

class ContactController extends Controller
{
    //
    public function send(ContactRequest $request){

        $contact = $request->all();

        Mail::to('hogehoge@gmail.com')->send(new Contact($contact));

        return 'メッセージを送信しました。';
    }
}

以上でコントローラーからバリデーションを外に出すことができました。