【问题标题】:laravel remove model observerlaravel 移除模型观察者
【发布时间】:2019-07-23 21:02:27
【问题描述】:

有没有办法删除用

添加的模型观察者
$model->observe(new ObserverObject)

可能是这样的

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

谢谢

【问题讨论】:

    标签: laravel laravel-4 observers


    【解决方案1】:

    您可以通过以下方式检查您的活动名称:

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

    并使用以下方法将其删除:

    $model->getEventDispatcher()->forget($event);
    

    【讨论】:

    • 您好,在我的情况下,getListeners() 函数不会返回任何内容,但是将事件作为字符串调用的忘记方法可以完美运行。有任何想法吗 ?我的原始代码是您答案的复制粘贴。我只是将 $model 更改为使用我的模型实例,最后将 $event 更改为硬编码的事件名称,'eloquent.updated: Profil'
    • 这对我不起作用,因为 getListeners() 需要一个参数(Laravel 4.2)
    • 是的 getListeners 需要事件名称,它会返回一个正在监听事件的闭包列表
    • 因此,对于整个 Observer,您可以调用 foreach ($model->getObservableEvents() as $event) $model->getEventDispatcher()->forget("MyAwesomeObserver@$event")
    • 如需始终保持最新信息,您可以关注您的Model::observe 呼叫链。这对我有用:foreach ($model->getObservableEvents() as $event) $model->getEventDispatcher()->forget("eloquent.{$event}: " . get_class($model)); }
    【解决方案2】:

    Laravel 5.8

    我有一个 AccountObserver,用于观察我的 AccountModel 上的创建过程:

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

    要禁用此功能,首先加载事件调度程序(通过任何 eloquent 模型),然后告诉它要忘记什么。这适用于任何观察者方法:

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

    如果你想再次记住它:

    AccountModel::observe(AccountObserver::class);
    

    【讨论】:

    • 我很想知道 -1 的用途。这没有用吗?有错误吗?这是代码的错误实现吗?
    • 这不会禁用所有创建事件吗?如果您想要保留多个需要创建事件的观察者怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多