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文字以内で入力してください。',
];
}
}
これでルールが適用されます。
実際に画面で確認すると「タイトルは空でない値を入力してください。」のエラーメッセージが表示されるようになりました。
ばっちり適用されています。
こんな感じで簡単にルール作成ができるようです。
この記事が気に入ったらサポートをしてみませんか?