Laravel 5 兼容且通用的方法:
我曾经遇到过同样的问题,并以一种通用的方式解决了它。如果您创建一个项目,它将使用默认规则;如果您更新一个项目,它将检查您的规则是否包含 :unique
并自动插入一个排除项(如果需要)。
创建一个 BaseModel
类,并让所有的模型都继承它:
<?php namespace App;
use Illuminate\Database\Eloquent\Model;
class BaseModel extends Model {
protected static $rules = [];
public static function getRules() {
return static::$rules;
}
public function getUpdateRules() {
$updateRules = [];
foreach(self::getRules() as $field => $rule) {
$newRule = [];
$ruleParts = explode('|',$rule);
foreach($ruleParts as $part) {
if(strpos($part,'unique:') === 0) {
if ( ! $this->isDirty($field)) {
$part = $part . ',' . $field . ',' . $this->getAttribute($field) . ',' . $field;
}
}
$newRule[] = $part;
}
$updateRules[$field] = join('|', $newRule);
}
return $updateRules;
}
}
你现在可以像往常一样在你的模型中定义规则:
protected static $rules = [
'name' => 'required|alpha|unique:roles',
'displayName' => 'required|alpha_dash',
'permissions' => 'array',
];
在控制器中验证它们。如果模型未通过验证,则会自动重定向回表单,并显示相应的验证错误。如果没有发生验证错误,它将继续执行其后的代码。
public function postCreate(Request $request)
{
// Validate
$this->validate($request, Role::getRules());
// Validation successful -> create role
Role::create($request->all());
return redirect()->route('admin.role.index');
}
public function postEdit(Request $request, Role $role)
{
// Validate
$this->validate($request, $role->getUpdateRules());
// Validation successful -> update role
$role->update($request->input());
return redirect()->route('admin.role.index');
}
就是这样! :) 注意,在创建时我们调用 Role::getRules()
,在编辑时我们调用 $role->getUpdateRules()
。
unique
。在该方法中,可以使用参数table
、column
、except
和idColumn
来进行更细致的验证操作。 - Luca FilosofiRule::unique('table', 'name')->ignore($userId)->whereNull('deleted_at')
来防止它针对已删除的记录进行检查。 - adrianp