Сумісний із 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)
{
$this->validate($request, Role::getRules());
Role::create($request->all());
return redirect()->route('admin.role.index');
}
public function postEdit(Request $request, Role $role)
{
$this->validate($request, $role->getUpdateRules());
$role->update($request->input());
return redirect()->route('admin.role.index');
}
Це воно! :) Зверніть увагу, що при створенні ми телефонуємо, Role::getRules()
а при редагуванні - $role->getUpdateRules()
.