Validate Unique - TypeError Argument 1 传递给 Illuminate\Validation\Factory::make() 必须是数组类型,给定 null

Joh*_*ohn 5 php laravel

我在 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)