見出し画像

Laravel 学習記録 #013 バリデーション独自ルールを学ぶ

Laravelのバリデーションについて独自ルールの作成について学習したものをまとめてます。

バリデーションの独自ルールを作る

Laravelの基本バリデーションは結構多様なルールが用意されていますが、
開発していると独自でのバリデーションルールが欲しかったりします。
そんな時の独自ルール作り方です。

ルールクラスのファイルを作る

app/Rules/配下にルールのファイルを配置します。
例としてNotEmpty.phpファイルを作成します。

php artisan make:rule ファイル名

// 例としてNoEmptyファイル
php artisan make:rule NotEmpty

NotEmpty.php

<?php

namespace App\Rules;

use Closure;
use Illuminate\Contracts\Validation\ValidationRule;

class NotEmpty implements ValidationRule
{
    /**
     * Run the validation rule.
     *
     * @param  \Closure(string): \Illuminate\Translation\PotentiallyTranslatedString  $fail
     */
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        //
    }
}

Laravel10では
validateメソッドが用意されています
ここに作成したいルールと、返却したいメッセージを定義します。

ルールをつくる

では、実際にルールを定義します。
例として値が null、空文字列、半角スペースのみ、または全角スペースのみでないことを検証するためのバリデーションルールを作成します。
$failにはエラーメッセージを定義しておきます。

<?php

namespace App\Rules;

use Closure;
use Illuminate\Contracts\Validation\ValidationRule;

class NotEmpty implements ValidationRule
{
    /**
     * Run the validation rule.
     *
     * @param  \Closure(string): \Illuminate\Translation\PotentiallyTranslatedString  $fail
     */
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        if(is_null($value) || empty(trim($value))){
            $fail(':attributeは空でない値を入力してください。');
        }
    }
}


ルールをつかう

作成したルールを前回作成したルールのrequiredの代わりに使ってみます。
フォームリクエストクラスにルールクラスのインスタンスをルールとして設定することで使えるので'title' => ['max:10' , new NotEmpty]とします。
※ルールクラスを使うためにuseを忘れずに

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\Rules\NotEmpty;

class StorePostRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     */
    public function authorize(): bool
    {
        // falseを返す場合は403エラーし、コントローラーは実行されない
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array|string>
     */
    public function rules(): array
    {
        return [
            // 'title' => ['required', 'max:10'],
            'title' => ['max:10' , new NotEmpty]
        ];
    }

    public function attributes(): array
    {
        return [
            'title' => 'タイトル',
        ];
    }

    public function messages(): array
    {
        return [
            // 'name属性.ルール' => '返すテキスト',
            'title.required' => ':attributeは必須です。',
            'title.max' => ':attributeは10文字以内で入力してください。',
        ];
    }
}

これでルールが適用されます。

実際に画面で確認すると「タイトルは空でない値を入力してください。」のエラーメッセージが表示されるようになりました。
ばっちり適用されています。

こんな感じで簡単にルール作成ができるようです。

この記事が気に入ったらサポートをしてみませんか?