Laravel 4唯一验证规则不起作用

时间:2014-10-05 06:40:58

标签: php laravel laravel-4 eloquent laravel-validation

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

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

但验证始终失败并显示已收到电子邮件的错误。请帮帮我们。

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您可以在请求类中使用route方法,但验证中的ID除外

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

答案 2 :(得分: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是静态的。

答案 3 :(得分: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中注释相同的函数 现在更新正在进行中。

答案 4 :(得分:-1)

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