Laravel如何实现非必填4位数字pin码的Request验证与默认值配置
Laravel 实现Pin码验证+默认值落库方案
1. 设置表单验证规则
不管你是在控制器内直接调用validate()方法,还是单独创建表单请求类,给pin字段配置以下规则即可:
'pin' => 'nullable|digits:4'
规则说明:
nullable:标记字段为非必填,允许不传值、传空内容,不会触发必填拦截digits:4:只要字段携带了非空值,就自动校验值必须为4位纯整数,123a、123、12345、12.3这类不符合格式的内容会直接返回校验错误,无需额外写正则
如果是用独立表单请求类,rules()方法示例:
public function rules() { return [ // 其余字段的验证规则... 'pin' => 'nullable|digits:4', ]; }
2. 实现空值默认存1111
两种常用方案选其一即可:
方案一:控制器层处理校验后数据
在拿到校验通过的数据后,手动补全空值的默认值,逻辑直观好调整:
public function store(PinFormRequest $request) { $validatedData = $request->validated(); // pin为空时设置默认值 if (empty($validatedData['pin'])) { $validatedData['pin'] = '1111'; } // 正常调用模型创建数据即可 PinModel::create($validatedData); // 后续返回、跳转逻辑... }
方案二:数据库默认值+请求预处理
一劳永逸,避免多个入口写模型创建逻辑时漏设默认值:
- 先给对应表的
pin字段设置数据库默认值,迁移文件字段定义示例:
写完执行$table->string('pin', 4)->default('1111');php artisan migrate生效。 - 在表单请求类里加预处理方法,把空值的
pin字段直接从请求中移除,这样存库时不会传空值覆盖数据库默认配置:protected function prepareForValidation() { if ($this->pin === '') { $this->request->remove('pin'); } }
注意不要用
numeric规则替代digits:4,numeric允许传入小数、负数,且不会校验固定长度,不符合4位纯数字的校验要求。
内容的提问来源于stack exchange,提问作者Hashir Hamza
相关产品推荐
相关产品推荐

