【Laravel】FormRequest

PHP

Controllerからvalidation処理をコード分離し、よりシンプルな構成にするための仕組み。


実装方法

事前にphp artisanコマンドでFormRequestを作成

php artisan make:request HogePostRequest 
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class HogePostRequest extends FormRequest
{
    /**
     * 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()メソッド
 初期状態ではreturn false;となるが、認証の有無をチェックしないのであればreturn true;で良い。
 true:認証成功
 false:認証失敗(403エラーを表示)

~抜粋~
    public function authorize()
    {
        return true;
    }
~抜粋~

rules()メソッド
 リクエストのパラメータごとにルールを設定する。

使用可能なルールについては定義さているのでそちらを参照。

9.x バリデーション Laravel
~抜粋~
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'name' => 'required',
            'age' => 'integer | between:18,120',
            'sex' => ['max:2', 'regex:/^[男|女|指定なし]+$/u'],
        ];
    }

・Controller側の対応
 Controllerの作成方法はこちらを参照

★変更前のController

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HogeController extends Controller
{
    // SingleActionControllerでは__invokeで作成する
    public function __invoke () 
    {
        $hello = 'Hello,World!';

        return view('hoge', compact('hello'));
    }
}

★変更後のController
 変更点はFormRquestをuseに追加、__invokeメソッドの引数追加

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\HogePostRequest;

class HogeController extends Controller
{
    // SingleActionControllerでは__invokeで作成する
    public function __invoke (HogePostRequest $request) 
    {
        $hello = 'Hello,World!';

        return view('hoge', compact('hello'));
    }
}

ここまで設定することで、Controllerが呼び出される前にバリデーションチェックが実施される。

さいごに

FatになりがちなControllerをよりシンプルにする方法は他にもあります。
ぜひこちらも試してみてください。

コメント

タイトルとURLをコピーしました