是否有可能暂时禁用Laravel中的事件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否有可能暂时禁用Laravel中的事件?相关的知识,希望对你有一定的参考价值。

我在'已保存'模型事件中有以下代码:

Session::flash('info', 'Data has been saved.')` 

因此,每次保存模型时,我都可以通过flash消息通知用户。问题是,有时我只需更新像'status'这样的字段或增加'计数器'而我不需要flash消息。那么,是否可以暂时禁用触发模型事件?或者有没有像$model->save()这样的Eloquent方法不会触发'已保存'事件?

答案

在这里,您可以看到如何禁用和再次启用事件观察器:

// getting the dispatcher instance (needed to enable again the event observer later on)
$dispatcher = YourModel::getEventDispatcher();

// disabling the events
YourModel::unsetEventDispatcher();

// perform the operation you want
$yourInstance->save();

// enabling the event dispatcher
YourModel::setEventDispatcher($dispatcher);

有关更多信息,请查看Laravel documentation

另一答案

Taylor的Twitter页面提供了一个很好的解决方案:

将此方法添加到基础模型,或者如果没有,请创建特征,或将其添加到当前模型

public function saveQuietly(array $options = [])
{
    return static::withoutEvents(function () use ($options) {
        return $this->save($options);
    });
}

然后在你的代码中,每当你需要保存模型而没有事件被触发时,只需使用:

$model->foo = 'foo';
$model->bar = 'bar';

$model->saveQuietly();

非常优雅和简单:)

另一答案

调用模型Object然后调用unsetEventDispatcher之后,您可以执行任何操作,而无需担心事件触发

像这个:

    $IncidentModel = new Incident;
    $IncidentModel->unsetEventDispatcher();

    $incident = $IncidentModel->create($data);
另一答案

您不应该将会话闪存与模型事件混合在一起 - 当事情发生时,模型不负责通知会话。

控制器在保存模型时调用会话闪存会更好。

这样您就可以控制何时实际显示消息 - 从而解决您的问题。

另一答案

要为最终在此寻找解决方案的任何人回答问题,您可以使用unsetEventDispatcher()方法禁用实例上的模型侦听器:

$flight = AppFlight::create(['name' => 'Flight 10']);
$flight->unsetEventDispatcher();
$flight->save(); // Listeners won't be triggered

以上是关于是否有可能暂时禁用Laravel中的事件?的主要内容,如果未能解决你的问题,请参考以下文章

Qt - 暂时禁用所有事件或窗口功能?

暂时禁用Java图形小程序中的双缓冲

禁用计划作业

Android:暂时禁用活动中的方向更改

需要一种有效的方法来避免使用 Laravel 5 重复代码片段

Laravel 中的服务器发送事件