【问题标题】:Laravel 4 Unique Validation Rules Not WorkingLaravel 4 独特的验证规则不起作用
【发布时间】:2014-11-29 18:30:05
【问题描述】:

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

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

【问题讨论】:

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

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


【解决方案1】:

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

【讨论】:

  • 如果我有更多的独特之处应该在更新时排除在外。我想我应该在 pass 方法中再次添加它?
  • @piso 对于唯一的,您只能使用一个 id 而不是很多。您应该一次只编辑一条记录,这样就足够了。
  • 更新用户名的时候怎么样?顺便说一句,用户名也是唯一的。
  • @piso 您可以传递参数数组并对现有规则进行更多更改。您可以修改用户名规则,就像我通过电子邮件向您展示的那样,并对其进行同样的操作。
【解决方案2】:

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

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】:

    我已经移动了这个函数:

    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】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2020-03-01
          • 2018-11-09
          • 1970-01-01
          • 2017-06-21
          • 1970-01-01
          • 2018-07-18
          • 2018-07-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多