Laravel 4唯一验证规则无效


Laravel 4 Unique Validation Rules Not Working

需要帮助更新验证规则中的唯一规则。我有一个抽象验证器,它将在存储到我的数据库之前验证规则,在规则数组中,我在创建或注册用户时将电子邮件设置为唯一的,但在更新用户时,如果电子邮件为用户所有,则enique电子邮件不应验证。

抽象类验证器

abstract class Validator {
    protected $errors;
    protected $attributes;
    public function __construct($attributes = null)
    {
        $this->attributes = $attributes ?: 'Input::all();
    }
    public function passes()
    {
        $validation = 'Validator::make($this->attributes, $this->rules());
        if ($validation->passes()) return true;
        $this->errors = $validation->messages();
        return false;
    }
    public function getErrors()
    {
        return $this->errors;
    }
}

验证规则(UserRule.php)

use MyCustomValidatorNamespaceHere....
class UserRules extends Validator
public function rules()
{
    return [
        'email' => 'required|email|unique:users,email,id',
        ...
    ];
}

在我的UserController中,我在constractor中注入了UserRule。(UserRule$UserRule)。这是update方法中的代码。

public function update($id)
{
    $if ($this->userRule->passes())
    {
       $this->user->find($id)->update(Input::all());
       return .........
    }
}

但验证总是失败,并显示电子邮件已被接收的错误。请帮帮伙计们。

问题在于您的规则。当您更新时,您需要使用不检查您更新的记录的unique。所以你应该有:

 unique:users,email,id

但例如:

 unique:users,email,10

如果您编辑id为10的记录。

你可以做的是定义这个规则:

'email' => 'required|email|unique:users,email,{id}',

以及您的passes方法:

public function passes($id = null)
{
    $rules = $this->rules();
    $rules['email'] = str_replace('{id}', $id, $rules['email']);
    $validation = 'Validator::make($this->attributes, $rules);
    if ($validation->passes()) return true;
    $this->errors = $validation->messages();
    return false;
}

现在使用更新规则:

if ($this->userRule->passes($id))

顺便说一句,你在$if ($this->userRule->passes())中有错误——它应该是if,而不是$if

您可以在请求类中使用route方法从验证中排除id

public function rules()
{
    return [
        'email' => 'required|email|unique:users,email,'.$this->route('user'),
        ...
    ];
}

我以前遇到过这样的问题,很难找到答案。以下是我所做的。

class UserRules extends Validator {
public function __construct($input = NULL) {
    $this->input = $input ?: 'Input::all();
    if(isset($this->input['id'])):
        self::$rules['username'] = 'required|unique:users,username,'.$this->input['id'];
        self::$rules['email'] = 'required|email|unique:users,email,'.$this->input['id'];
    else:
        self::$rules['username'] = 'required|unique:users';
        self::$rules['email'] = 'required|email|unique:users';
    endif;
}
public static $rules = array(
    'company_id' => 'required',
    'role' => 'required',
    'password' => 'sometimes|required|confirmed'
);
}

您需要使用self::,因为$rules是静态的。

我已经移动了这个函数:

public function passes($id)
{
    $rules = static::$rules;
    $rules['username'] = str_replace('{id}', $id, $rules['username']);
    $rules['email'] = str_replace('{id}', $id, $rules['email']);
    $validation = 'Validator::make($this->attributes, $rules);
    if($validation->passes()) return true;
    $this->errors = $validation->messages();
    return false;
}

并在抽象类Validator中对相同的函数进行了注释现在正在进行更新。

我在stackoverflow上以一种通用的方式解决了这个问题。如果您进行更新,它将自动调整您的规则,并在必要时向:unique添加异常。