laravelのバリデーションはフォームリクエストで定義しよう

スポンサーリンク

複雑なバリデーション をコントローラーで定義すると、コントローラが肥大化してしまいます。

コントローラーには他の役割があるので、バリデーション はフォームリクエストで行うようにした方が良いと思います。

フォームリクエスト作成

php artisan make:request SampleRequest

上記はSampleRequestという名のフォームリクエストクラスを生成するためのArtisan CLIコマンドです。

フォームリクエストクラスはapp/Http/Requestに生成されます。

中身は以下のようになっています。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class SampleRequest 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 [
            //
        ];
    }
}

バリデーション ルールの書き方

rulesメソッドの中にバリデーション ルールを記載していきます。

例えば、

    public function rules()
    {
        return [
           'message' => 'required|max:100',
        ];
    }

上記の例は、messageは「必須項目で最大100字まで」というバリデーション になります。

エラー時はどうする?

バリデーション エラーが発生した際に、クライアントにメッセージを返すには、以下のメソッドを追加してください。

    
protected function failedValidation(Validator $validator) {
        $res = response()->json(['error'=>'Unauthorised'], 400);
        throw new HttpResponseException($res);
    }

エラーになった場合は、400(Bad Request)を返すようにしています。

エラーの詳細(エラーメッセージ等)は$resないに綴じられているので、クライアント側で展開してください!

その他

authorizeメソッドの返り値はtrueに変更した方が良いです。

authorizeメソッドがfalseを返すと、403ステータスコードのHTTPレスポンスが自動的に返され、コントローラメソッドは実行されません。

https://readouble.com/laravel/5.5/ja/validation.html

公式サイトに書かれているのですが、authorizeメソッドではユーザがこのリクエストの権限を持っているかを判定しています。

したがって、falseを返すと「権限ないよ」と弾かれてしまいます。

なのでtrueにしておくことをお勧めします。

Laravel
スポンサーリンク
エンジニアの日記

コメント