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

cod*_*bug 12 laravel laravel-4

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

Session::flash('info', 'Data has been saved.')` 
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*Dan 29

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

public function saveWithoutEvents(array $options=[])
{
    return static::withoutEvents(function() use ($options) {
        return $this->save($options);
    });
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看Laravel文档

  • 这个答案在编写时很棒,但现在有一种更干净的方法,[使用下面的 `withoutEvents()`](/sf/answers/3915234221/) :) (2认同)
  • @丹,这太棒了。我不知道 `saveQuietly()` 但为我工作。感谢您随着 Laravel 的变化不断更新这篇文章!你这个大佬,丹! (2认同)

Mor*_*abi 23

在泰勒的Twitter页面上有一个很好的解决方案:

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

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

然后在您的代码中,每当需要保存模型而不触发事件时,只需使用以下命令:

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

$model->saveQuietly();
Run Code Online (Sandbox Code Playgroud)

非常优雅和简单:)

  • 作为参考,此PR已添加:https://github.com/laravel/framework/pull/27419 (2认同)

And*_*ell 10

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

$flight = App\Flight::create(['name' => 'Flight 10']);
$flight->unsetEventDispatcher();
$flight->save(); // Listeners won't be triggered
Run Code Online (Sandbox Code Playgroud)

  • 创建和创建事件触发器不会在第一行触发吗? (3认同)

小智 7

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

像这个:

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

    $incident = $IncidentModel->create($data);
Run Code Online (Sandbox Code Playgroud)


Spa*_*gCS 5

在 laravel 7.x 中,你可以像这样简单地做到这一点

use App\User;

$user = User::withoutEvents(function () {
    User::findOrFail(1)->delete();

    return User::find(2);
});
Run Code Online (Sandbox Code Playgroud)

更多内容请参阅 Laravel 7.x 静音事件文档


Dav*_*rez 5

在 Laravel 8.x 中:

保存没有事件的单个模型

有时您可能希望“保存”给定模型而不引发任何事件。您可以使用 saveQuietly 方法来完成此操作:

$user = User::findOrFail(1);

$user->name = 'Victoria Faith';

$user->saveQuietly();
Run Code Online (Sandbox Code Playgroud)

请参阅 Laravel 文档


Lau*_*nce 4

您不应该将会话闪烁与模型事件混合在一起 - 当发生某些情况时,模型没有责任通知会话。

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

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