Laravel Validation
フォームリクエスト
生成コマンド
php artisan make:request TestRequest
Validation
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class TestRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
’column1′ => ‘required | array’,
’column2′ => ‘required | integer’,
];
}
public function messages()
{
return [];
}
public function attributes()
{
return [
’column1′ => ‘〜’,
’column2′ => ‘〜’,
];
}
}
使用
namespace App\Http\Controllers;
use App\Http\Requests\TestRequest;
class TestController extends Controller
{
public function test(TestRequest $request)
{
〜
}
}
バリデータ
Validation
namespace App\Rules;
use Illuminate\Support\Facades\Validator;
trait TestValidation
{
protected function checkTest(Request $request)
{
$validator = Validator::make($request->all(),
[
’column’ => [‘max:255′],
],
[
’column.max’ => ‘E999’,
]
);
失敗時
if ($validator->fails()) {
エラーコード取得
$codes = $validator->errors()->all();
return $codes;
}
成功時
return true;
}
}
呼び出し
class TestController extends Controller
{
use \App\Rules\TestValidation;
public function test(Request $request)
{
$result = $this->checkTest($request);
}
}
返却
$validator->errors()->add(‘field’, ‘メッセージ’);
throw new ValidationException($validator);
または
throw ValidationException::withMessages([‘field’ => ‘メッセージ’]);
ルール
一覧
ルール | 機能 | 備考 |
---|---|---|
required | 必須 | |
required_if:param,1 | 条件必須 | |
nullable | 未設定許可 | |
integer | 数値 | |
string | 文字列 | |
array | 配列 | |
Eメール | ||
digits:3 | 3桁の数値 | |
digits_between:1,5 | 1〜5桁の数値 | |
regex:/^\+[0-9]{12}$/ | 正規表現 | |
exists:users,id | usersテーブルにIDが存在する | 複雑な条件でのexists 「WHERE句を用いた問い合わせを用いたルール」参照 |
usersテーブルでphoneが重複しない 実際にはこの書き方では正常に動作しない。現在レコードの除外が必要 |
Rule::unique('users', 'phone')
|
|
min:6 | 最小桁 | |
max:255 | 最大桁 | |
size:10 | 指定の値(10)と一致するか | |
gt:別フィールド名 | 指定の別フィールドより大きいか | 時間は使えない |
gte:別フィールド名 | 指定の別フィールドより同じか大きいか | 時間は使えない |
lt:別フィールド名 | 指定の別フィールドより小さいか | 時間は使えない |
lte:別フィールド名 | 指定の別フィールドより同じか小さいか | 時間は使えない |
before:別フィールド名 | 指定の別フィールドより前か | 時間に使える |
before_or_equal:別フィールド名 | 指定の別フィールドより同じか前か | 時間に使える |
after:別フィールド名 | 指定の別フィールドより後か | 時間に使える |
after_or_equal:別フィールド名 | 指定の別フィールドより同じか後か | 時間に使える |
in:0,1,A,B | 0,1,A,Bのいずれか | Rule::in([0,1,A,B]) |
not_in:0,1,A,B | 0,1,A,Bでない | |
date_format:Y-m-d | 日時フォーマット | |
date_format:Y-m-d H:i:s | 日時フォーマット | |
bail | エラー時に以後のバリデーションを実行しない | 複数ルール設定時 |
複数
public function rules()
{
return [
’column1′ => ‘required | array’,
’column2′ => [
’required’,
’integer’,
],
];
}
独自ルール
Rule::exists
use Illuminate\Validation\Rule;
public function rules()
{
return [
’column3′ => [
‘exists:users,id’にwhere句を追加
Rule::exists(‘users’, ‘id’)->where(function ($query) {
$query->where(‘col1’, 1)
->whereNull(‘col2’);
}),
],
];
}
Rule::requiredIf
use Illuminate\Validation\Rule;
public function rules()
{
return [
’column4′ => [
Rule::requiredIf(function () use ($input) {
return $input[‘status’] === ‘A’;
}),
],
];
}
独自関数
配列
public function rules()
{
return [
’columns’ => [
'string',
function ($attribute, $value, $fail) {
if ($value !== 'abcde') {
$fail("$attribute must be abcde");
}
},
],
];
}