Laravel 5 kompatibler und generischer Weg:
Ich hatte nur das gleiche Problem und löste es auf generische Weise. Wenn Sie ein Element erstellen, werden die Standardregeln verwendet. Wenn Sie ein Element aktualisieren, werden Ihre Regeln überprüft :unique
und automatisch ein Ausschluss eingefügt (falls erforderlich).
Erstellen Sie eine BaseModel
Klasse und lassen Sie alle Ihre Modelle davon erben:
<?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;
}
}
Sie definieren jetzt Ihre Regeln in Ihrem Modell so, wie Sie es gewohnt sind:
protected static $rules = [
'name' => 'required|alpha|unique:roles',
'displayName' => 'required|alpha_dash',
'permissions' => 'array',
];
Und validieren Sie sie in Ihrem Controller. Wenn das Modell nicht validiert wird, wird es automatisch mit den entsprechenden Validierungsfehlern zum Formular zurückgeleitet. Wenn keine Validierungsfehler aufgetreten sind, wird der Code danach weiter ausgeführt.
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');
}
Das ist es! :) Beachten Sie, dass wir beim Erstellen Role::getRules()
und beim Bearbeiten aufrufen $role->getUpdateRules()
.