4

需要帮助更新我的验证规则中的唯一规则。我有一个抽象验证器,它将在存储到我的数据库和规则数组之前验证规则,我在创建或注册用户时将电子邮件设置为唯一,但是在更新用户时,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 中,我在构造函数中注入了 UserRule。(用户规则 $userRule)。这是更新方法中的代码。

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

但验证总是失败并显示电子邮件已被接收的错误。请帮助各位。

4

5 回答 5

4

问题是你的规则。当您更新时,您需要使用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

于 2014-10-05T07:16:36.473 回答
1

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

public function rules()
{
    return [
        'email' => 'required|email|unique:users,email,'.$this->route('user'),
        ...
    ];
}
于 2017-11-18T18:45:55.297 回答
0

我已经移动了这个功能:

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;

}

进入 UserRule.php 并在抽象类 Validator 中注释了相同的函数 现在更新正在工作。

于 2014-11-27T09:59:14.007 回答
0

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

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 是静态的。

于 2014-11-14T19:54:00.307 回答
-1

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

于 2015-01-31T17:42:24.543 回答