['required', 'string', 'max:20', 'regex:/^[a-zA-Z0-9]+$/'], 'cancelFlag' => ['nullable'], 'SyunoPayLimit' => ['nullable', 'string', 'regex:/^\d{12}$/'], 'SyunoPayAmount' => ['nullable', 'integer', 'min:1'], 'SyunoNameKanji' => ['nullable', 'string', 'max:40'], 'SyunoNameKana' => ['nullable', 'string', 'max:40'], 'SyunoTel' => ['nullable', 'string', 'max:13', 'regex:/^[0-9\\-]+$/'], 'SyunoFree1' => ['nullable', 'string', 'max:32'], 'SyunoFree2' => ['nullable', 'string', 'max:32'], 'SyunoFree3' => ['nullable', 'string', 'max:32'], 'SyunoFree4' => ['nullable', 'string', 'max:32'], 'SyunoFree5' => ['nullable', 'string', 'max:32'], 'SyunoFree6' => ['nullable', 'string', 'max:32'], 'SyunoFree7' => ['nullable', 'string', 'max:32'], 'SyunoFree8' => ['nullable', 'string', 'max:32'], 'SyunoFree9' => ['nullable', 'string', 'max:60'], 'SyunoFree10' => ['nullable', 'string', 'max:60'], 'SyunoFree11' => ['nullable', 'string', 'max:60'], 'SyunoFree12' => ['nullable', 'string', 'max:60'], 'SyunoFree13' => ['nullable', 'string', 'max:60'], 'SyunoFree14' => ['nullable', 'string', 'max:60'], 'SyunoFree15' => ['nullable', 'string', 'max:60'], 'SyunoFree16' => ['nullable', 'string', 'max:60'], 'SyunoFree17' => ['nullable', 'string', 'max:60'], 'SyunoFree18' => ['nullable', 'string', 'max:60'], 'SyunoFree19' => ['nullable', 'string', 'max:42'], 'SyunoFree20' => ['nullable', 'string', 'max:12'], 'SyunoFree21' => ['nullable', 'string', 'max:11'], ]; } /** * バリデーション失敗時のJSONエラーレスポンス */ protected function failedValidation(Validator $validator): void { throw new HttpResponseException(response()->json([ 'error' => [ 'code' => 'INVALID_REQUEST', 'message' => $validator->errors()->first(), ] ], 400)); } /** * 追加バリデーション(支払期限の範囲チェック) */ public function withValidator($validator): void { $validator->after(function ($validator) { $payLimit = $this->input('SyunoPayLimit'); if ($payLimit === null) { return; } try { $dt = Carbon::createFromFormat('YmdHi', $payLimit, 'Asia/Tokyo'); $errors = Carbon::getLastErrors() ?: ['warning_count' => 0, 'error_count' => 0]; if (($errors['warning_count'] ?? 0) > 0 || ($errors['error_count'] ?? 0) > 0) { $validator->errors()->add('SyunoPayLimit', 'SyunoPayLimitの日時が不正です。'); return; } } catch (\Throwable) { $validator->errors()->add('SyunoPayLimit', 'SyunoPayLimitの日時が不正です。'); return; } $now = Carbon::now('Asia/Tokyo'); $max = $now->copy()->addDays(365); if ($dt->lessThanOrEqualTo($now)) { $validator->errors()->add('SyunoPayLimit', 'SyunoPayLimitは現在時刻より未来を指定してください。'); } elseif ($dt->greaterThan($max)) { $validator->errors()->add('SyunoPayLimit', 'SyunoPayLimitは365日以内で指定してください。'); } }); } }