> */ public function rules(): array { return [ 'cc_cardholder_first' => ['required', 'string', 'max:50'], 'cc_cardholder_last' => ['required', 'string', 'max:50'], 'cc_cardpan' => ['required', 'string', 'regex:/^\d{12,19}$/'], 'cc_cardexpiremonth' => ['required', 'string', 'regex:/^(0[1-9]|1[0-2])$/'], 'cc_cardexpireyear' => ['required', 'string', 'digits:4'], 'cc_cardtype' => ['required', 'string', 'in:V,M'], 'cc_cardcvc2' => ['required', 'string', 'regex:/^\d{3,4}$/'], ]; } /** * @return array */ public function messages(): array { return [ 'cc_cardholder_first.required' => __('abo.card_holder_required'), 'cc_cardholder_last.required' => __('abo.card_holder_required'), 'cc_cardpan.required' => __('abo.card_number_invalid'), 'cc_cardpan.regex' => __('abo.card_number_invalid'), 'cc_cardexpiremonth.required' => __('abo.card_expiry_invalid'), 'cc_cardexpiremonth.regex' => __('abo.card_expiry_invalid'), 'cc_cardexpireyear.required' => __('abo.card_expiry_invalid'), 'cc_cardexpireyear.digits' => __('abo.card_expiry_invalid'), 'cc_cardtype.in' => __('abo.card_type_invalid'), 'cc_cardcvc2.required' => __('abo.card_cvc_invalid'), 'cc_cardcvc2.regex' => __('abo.card_cvc_invalid'), ]; } /** * Builds the validated, immutable DTO for the payment service. */ public function toDto(): CreditCardCheckData { return CreditCardCheckData::fromFormData($this->validated()); } }