我在 User 模型中有这个方法:
public function setDocAttribute($value){
return $this->attributes['doc'] = $this->clear($value);
}
Run Code Online (Sandbox Code Playgroud)
清除方法:
private function clear(?string $arg){
if(empty($arg)){
return '';
}
return str_replace(['.','-'], '', $arg);
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个类 User 用这个规则扩展 FormRequest :
class User extends FormRequest
{
public function rules()
{
return [
'doc' => (!empty($this->request->all()['id']) ? 'required|unique:users,doc,' . $this->request->all()['id'] : 'required|unique:users, doc'),
...
];
}
}
Run Code Online (Sandbox Code Playgroud)
但是规则的唯一部分不能正常工作,因为 doc 输入有 pontuation,所以它会比较例如“0043-23.00”与“00432300”及其不同,因此验证通过。要在用户表单中解决此问题,请使用 all() 方法清除 'doc' 输入:
public function all($keys = null)
{
return $this->clear($this->request->all());
}
Run Code Online (Sandbox Code Playgroud)
方法清除():
public function clear($inputs)
{
$inputs['doc'] = str_replace(['.','-'],'', $this->request->all()['doc']);
return $inputs;
}
Run Code Online (Sandbox Code Playgroud)
但像这样显示一个错误:
“传递给 Illuminate\Validation\Factory::make() 的 TypeError Argument 1 必须是数组类型,给定 null”。
你知道为什么吗?
小智 1
也许你错过return了方法all。
您可以使用唯一的验证规则来进行更简单的检查:
public function rules()
{
return [
'doc' => [(new Unique('users', 'doc'))->ignore($this->request->get('id'))],
// ...
];
}
Run Code Online (Sandbox Code Playgroud)