2014-09-16 4 views
0

Есть ли способ написать мой собственный валидатор перед функцией отсоединения.Laravel: Где я могу написать свой beforeDetach

Например, у меня есть пользователи и группы с отношениями «многие ко многим». Невозможно удалить последнего администратора из группы, если только пользователь не является последним членом группы. Я не хотел бы всегда писать такую ​​же проверку в контроллерах.

Это довольно просто, чтобы написать BeforeSave и afterSave написав

public function save() 
{ 
    // Before save 
    parent::save(); 
    // After save 
} 

Но в настоящее время я не занимаюсь, где я должен написать мой beforeDetach.

я вызываю метод отсоединения, как этот

$group->users()->detach($user_id); 

Я хочу, чтобы в фоновом режиме всегда пассивно проверить некоторые условия, которые должны быть выполнены.

В настоящее время я не нашел решение. Если это невозможно изначально, как следует его реализовать?

Редактировать

Думаю, это было бы еще круче, если бы я мог иметь методы, подобные этим:

$group->users()->detach($user_id); 
$group->users()->validateAndDetach($user_id) 
+0

Возможно, вы нашли решение, я должен расширить класс BelongsToMany.И когда я устанавливаю отношения, я должен использовать свой новый класс. Собираюсь попробовать это сейчас –

ответ

1

Вот рабочее решение, хотя и не самый красивый. Любые указатели для улучшения этого приветствуются.

Прежде всего я расширил класс BelongsToMany:

class BelongsToManyGroupUser extends Illuminate\Database\Eloquent\Relations\BelongsToMany 
{ 
    public function detach($ids = array(), $touch = true) 
    { 
     // Before detach 
     parent::detach(); 
     // After detach 
    } 
} 

Затем я создал новый метод в моей группе модели:

public function belongsToManyGroupUser($related, $table = null, $foreignKey = null, $otherKey = null) 
{ 
    $caller = $this->getBelongsToManyCaller(); 
    $foreignKey = $foreignKey ?: $this->getForeignKey(); 
    $instance = new $related; 
    $otherKey = $otherKey ?: $instance->getForeignKey(); 
    if (is_null($table)) 
    { 
     $table = $this->joiningTable($related); 
    } 
    $query = $instance->newQuery(); 
    return new BelongsToManyGroupUser($query, $this, $table, $foreignKey, $otherKey); 
} 

Где я довольно много скопировал базу этой функции и просто вернул мой новый объект BelongsToManyGroupUser.

И я установил отношения как этот

public function users() 
{ 
    return $this->belongsToManyGroupUser('User', 'group_user'); 
} 

Что мне не нравится в этом решении еще тот факт, что я скопировал 10 строк кода из класса BelongsToMany. Если бы эти изменения изменились, я должен вручную внести изменения. Кроме того, я сделал изменения от:

return new BelongsToMany($query, $this, $table, $foreignKey, $otherKey, $caller['function']);` 

Для:

return new BelongsToManyGroupUser($query, $this, $table, $foreignKey, $otherKey, $caller); 

уведомления последнего параметра. Бывший дал мне ошибки, и поскольку $ caller уже является String, который ожидает конструктор, я просто передал $ caller в качестве последнего параметра. Я еще не уверен в эффектах.

редактировать:

И теперь я могу написать свою собственную функцию validateAndDetach в классе BelongsToManyGroupUser.

Смежные вопросы