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