laravel удалить наблюдатель модели

Есть ли способ удалить наблюдателя модели, который добавляется с помощью

$model->observe(new ObserverObject)

Может быть, что-то вроде

$model->observers['ObserverObject']->remove()

Спасибо


person Leon    schedule 30.04.2014    source источник


Ответы (2)


Вы можете проверить название своего события, выполнив:

dd( $model->getEventDispatcher()->getListeners() );

И удалите его, используя:

$model->getEventDispatcher()->forget($event);
person Antonio Carlos Ribeiro    schedule 30.04.2014
comment
Здравствуйте, в моем случае функция getListeners() ничего не возвращает, но методы забывания, вызываемые с событием в виде строки, работают отлично. Любые идеи ? Мой исходный код - это копия из вашего ответа. Я только что изменил $model, чтобы использовать экземпляр моей модели, и, наконец, изменил $event на жестко закодированное имя события, 'eloquent.updated: Profil'. - person elfif; 17.10.2014
comment
У меня это не работает, потому что для getListeners() нужен параметр (Laravel 4.2) - person Samuel De Backer; 07.12.2014
comment
Да, getListeners требует имя события и возвращает список замыканий, прослушивающих событие. - person Moak; 09.11.2015
comment
Таким образом, для всего Observer вы бы назвали foreach ($model->getObservableEvents() as $event) $model->getEventDispatcher()->forget("MyAwesomeObserver@$event") - person Ken; 26.03.2020
comment
Чтобы всегда получать актуальную информацию, вы можете следить за своим Model::observe звонком по цепочке. Это сработало для меня: foreach ($model->getObservableEvents() as $event) $model->getEventDispatcher()->forget("eloquent.{$event}: " . get_class($model)); } - person AlbinoDrought; 15.01.2021

Ларавель 5.8

У меня есть AccountObserver, который наблюдает за процессом создания в моей AccountModel:

class AccountObserver
{
     public function creating(AccountModel $account)
     {
     ....
     }
}

Чтобы отключить это, сначала загрузите диспетчер событий (через любую красноречивую модель), а затем скажите ему, что нужно забыть. Это работает для любого метода наблюдателя:

$eventDispatcher = AccountModel::getEventDispatcher();
$eventDispatcher->forget('eloquent.creating: App\Models\AccountModel');

Если вы хотите вспомнить это снова:

AccountModel::observe(AccountObserver::class);
person Aine    schedule 23.07.2019
comment
Я хотел бы знать, для чего нужен -1. Это не сработало? Была ли ошибка? Это плохая реализация кода? - person Aine; 02.04.2020