更新和保存时的Laravel验证差异

更新和保存时的Laravel验证差异,laravel,laravel-4,Laravel,Laravel 4,我使用Jeffrey Way的模型验证()来验证保存和更新。使用此方法,假设您填写一个更新条目上的某些字段,然后调用save()方法,验证将在当前在条目上设置的所有字段上运行。但如果验证要求字段(如电子邮件地址)唯一,则验证将失败,因为它已经存在: User.php: protected static $rules = [ 'email' => 'required|email|unique:users', 'firstname' => 'required',

我使用Jeffrey Way的模型验证()来验证保存和更新。使用此方法,假设您填写一个更新条目上的某些字段,然后调用
save()
方法,验证将在当前在条目上设置的所有字段上运行。但如果验证要求字段(如电子邮件地址)唯一,则验证将失败,因为它已经存在:

User.php:

protected static $rules = [
    'email' => 'required|email|unique:users',
    'firstname' => 'required',
    'lastname' => 'required'
];
Controller.php:

     // Get user from id
    $user = User::find($id);

    // Update user
    $user->update($data);

    // Validation when model is saved, via Way\Database\Model
    if ($user->save())
    {
            return Response::json([
                'data' => $user->toArray()
            ], 200);
    }

    if ($user->hasErrors())
    {
        return Response::json([
            'errors' => $user->getErrors()
        ]);
    }

将返回错误,因为电子邮件地址未通过验证。那么,使用这种方法,您如何告诉验证器忽略电子邮件的唯一规则呢?

我遇到了这个问题!我自己决定了这个问题

protected static $rules = [
    'email' => $user->email == Input::get('email') ? 'required|email' : 'required|email|unique:users',
    'firstname' => 'required',
    'lastname' => 'required'
];

您不能使用此软件包执行此操作,因为您需要传递
unique
规则的id。你可以这样做:

protected static $rules = [
    'email' => 'required|email|unique:users,email,{id}',
    'firstname' => 'required',
    'lastname' => 'required'
];

并扩展此模型以添加自定义验证方法,将
{id}
替换为
id
属性

我认为我使用了不同方法的类似行为。使用这个模型,我认为您应该重写validate方法,从自定义方法获取规则,这样您就可以为现有模型设置新规则

类似这样的方法可能会奏效:

protected function processRules($rules = array()) {
     $result = [];
     if (empty($rules)) {
         $rules = static::$rules; 
     }
     // Add unique except :id
     $replace = ($this->exists()) ? ',' . $this->getKey() : '';
     foreach ($rules as $key => $rule) {
         $result[$key] = str_replace(',:' . $this->getKeyName(), $replace, $rule);
     }

     return $result;       

}
并重写validate方法以调用
processrules
方法

 public function validate() {
     $v = $this->validator->make($this->attributes, $this->processRules(static::$rules), static::$messages);
     if ($v->passes()) {
         return true;
     }
     $this->setErrors($v->messages());
     return false;
 }
现在,您可以将您的
电子邮件
规则定义为
required | email | unique:users
,当它是一个新用户时,规则应该是
required | email | unique:users
,当您用id 1234更新用户时,规则将是
required | email | unique:users:1234


我希望它对你有用

这是完美的-工作很好。但是,在
(empty($rules)
之后,您的代码中缺少了一个“)”。谢谢您的帮助!不客气。它几乎与我当前使用的模型相同—还有一些其他的添加—所以我已经解决了这个问题。也许您可能对Ardent()感兴趣,我正在使用这个。我修复了括号;-)