|string> */ public function rules(): array { return [ 'firstname' => 'required', 'lastname' => 'required', 'email' => 'nullable|email|unique:customers,email', 'address' => 'nullable', 'phone' => 'required', 'gender' => 'nullable', 'company' => 'nullable', 'cccd' => 'nullable', 'front_cccd' => 'nullable', 'back_cccd' => 'nullable' ]; } public function messages(): array { return [ 'firstname.required' => 'Vui lòng nhập họ.', 'lastname.required' => 'Vui lòng nhập tên.', 'email.email' => 'Email không đúng định dạng.', 'address.string' => 'Địa chỉ không hợp lệ.', 'phone.required' => 'Vui lòng nhập số điện thoại.', 'gender.in' => 'Giới tính không hợp lệ.', 'company.string' => 'Tên công ty không hợp lệ.', 'cccd.required' => 'Vui lòng nhập số căn cước công dân.', 'cccd.digits' => 'Số căn cước công dân phải gồm 12 chữ số.', 'front_cccd.required' => 'Vui lòng tải lên hình ảnh mặt trước căn cước công dân.', 'front_cccd.image' => 'Tệp mặt trước CCCD phải là hình ảnh.', 'front_cccd.mimes' => 'Ảnh mặt trước CCCD phải có định dạng: jpeg, png, jpg.', 'front_cccd.max' => 'Ảnh mặt trước CCCD không được vượt quá 2MB.', 'back_cccd.required' => 'Vui lòng tải lên hình ảnh mặt sau căn cước công dân.', 'back_cccd.image' => 'Tệp mặt sau CCCD phải là hình ảnh.', 'back_cccd.mimes' => 'Ảnh mặt sau CCCD phải có định dạng: jpeg, png, jpg.', 'back_cccd.max' => 'Ảnh mặt sau CCCD không được vượt quá 2MB.', ]; } }