バリデーション 6.x Laravelの”言語ファイルでカスタム値を指定”が日本語版ドキュメントの対応箇所です。
Laravel でフォームリクエストのバリデーションを作る時、ステータスなど度々任意の範囲の定数に含まれるか否かのルールを作る時がままあります。
class HogeUpdateRequest extends FormRequest
{
public function rules(): array
{
return [
'status' => [new In([0, 1, 2, 3, 4])];
];
}
}
上の素朴な書き方ではが何の意味なのかわかりにくいです。こうなっていると一部の人しかわからないか、外部のドキュメントを読むことになります。これを分かりやすくするためにモデル等なにかしらに定数を置いておく方法があります。
class HogeUpdateRequest extends FormRequest
{
public function rules(): array
{
return [
'status' => [new In(array_keys(Hoge::STATUS))];
];
}
}
class Hoge extend Model
{
public const STATUS_DISABLE = 0;
public const STATUS_AVAILABLE = 1;
public const STATUS_USED = 2;
public const STATUS_CANCELED = 3;
public const STATUS_EXPIRED = 4;
public const STATUS = [
self::STATUS_DISABLE => '無効',
self::STATUS_AVAILABLE => '使用可能',
self::STATUS_USED => '使用済み',
self::STATUS_CANCELED => 'キャンセル済み',
self::STATUS_EXPIRED => '期限切れ',
];
}
これで status はモデル Hoge で定義されている status のいずれかであるべき、というルールが分かりやすくなります。開発者側にはこれで十分なのですが、これの延長でユーザ側に不便が起きる時があります。
class HogeUpdateRequest extends FormRequest
{
public function rules(): array
{
return [
'hoge.status' => [new In(array_keys(Hoge::STATUS))];
// もし 無効 に状態を変更をするなら理由が必要
'hoge.disable_reason' => ['required_if:hoge.status,'. Hoge::STATUS_DISABLE];
];
}
public function attributes()
{
return [
'hoge.status' => '状態',
'hoge.disable_reason' => '無効理由',
];
}
}
class Hoge extend Model
{
public const STATUS_DISABLE = 0;
public const STATUS_AVAILABLE = 1;
public const STATUS_USED = 2;
public const STATUS_CANCELED = 3;
public const STATUS_EXPIRED = 4;
public const STATUS = [
self::STATUS_DISABLE => '無効',
self::STATUS_AVAILABLE => '使用可能',
self::STATUS_USED => '使用済み',
self::STATUS_CANCELED => 'キャンセル済み',
self::STATUS_EXPIRED => '期限切れ',
];
}
このように特定のキーが特定の値になるルールではバリデーションエラーメッセージは次の様になります。
状態が0の場合、無効理由も指定してください。
カスタムで文面は変わるにせよ 0 などの数値がそのまま表記されます。これを変える方法は次です。
// /resources/lang/ja/validation.php の様な言語ファイル
'required_if' => ':otherが:valueの場合、:attributeも指定してください。',
// この values 以下を追記
'values' => [
'hoge' => [
'status' => \App\Models\Eloquents\Hoge::STATUS, // [0 => '無効'] な要素のある配列
],
],
このようにするとメッセージ中の:valueの値が置き換わり、次の様に自然言語のみで出力されます。
状態が無効の場合、無効理由も指定してください。
これでメッセージを無理に加工することなくユーザに見せられる表現にできます。
フォームリクエストで使いたいなら次の様に FormRequest の基底クラスを改造して value を置き換えられるようにする必要があります
<?php
namespace App\Http\Requests;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Http\FormRequest;
class BaseFormRequest extends FormRequest
{
/**
* フォームリクエストで使う Validator
* @return Validator
*/
protected function getValidatorInstance()
{
$validator = parent::getValidatorInstance();
// ここで下記の置き換え定義の values をセット
$validator->setValueNames($this->values());
$this->setValidator($validator);
return $this->validator;
}
/**
* :value の置き換え定義
* @see https://readouble.com/laravel/6.x/ja/validation.html?header=%E8%A8%80%E8%AA%9E%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A7%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E5%80%A4%E3%82%92%E6%8C%87%E5%AE%9A
* @return array
*/
protected function values(): array
{
return [];
}
}