拉拉维尔。如果数据库正在播种,则禁用观察者方法
Posted
技术标签:
【中文标题】拉拉维尔。如果数据库正在播种,则禁用观察者方法【英文标题】:Laravel. Disable observer methods if the database is seeding 【发布时间】:2021-05-21 03:58:54 【问题描述】:我的用户模型有一个观察者。在我的观察者->创建的事件中,我有一些代码。
public function created(User $user)
sendEmail();
所以,这个想法是,当一个用户被创建时,系统会向用户发送该帐户已创建的电子邮件通知。
问题:当数据库播种时,它也调用此方法“创建”并向用户(在种子中)发送电子邮件通知。 所以,我的问题是,如果目前 laravel 正在播种数据,我该如何检查,可能在这个“创建”方法中 -> 不要发送电子邮件,不要运行“创建”观察者方法。
尝试谷歌,发现了一些东西,但工作不正确。
类似YourModel::flushEventListeners();
【问题讨论】:
【参考方案1】:您可以使用YourModel::unsetEventDispatcher();
删除模型临时的事件侦听器。
如果在同一执行中播种后需要它们,您可以读取调度程序,取消设置它们,然后再次设置它们。
$dispatcher = YourModel::getEventDispatcher()
// Remove Dispatcher
YourModel::unsetEventDispatcher();
// do stuff here
// Re-add Dispatcher
YourModel::setEventDispatcher($dispatcher);
【讨论】:
亲爱的朱利安,感谢您的回答。你能说一下,我应该在哪里写这个代码,在哪个文件中。还有一个,有没有办法只为我当前的活动禁用? (创建)。据我了解,您的代码将禁用所有可能的事件。如果某些事件在未来播种期间应该起作用怎么办。谢谢 您可以在特定播种机中调用它。如果您需要在播种用户之前或之后的事件,您可以使用扩展示例仅禁用这部分代码的事件【参考方案2】: namespace Database\Seeders;
use App\Models\Blog;
use Illuminate\Database\Seeder;
class BlogsTableSeeder extends Seeder
public function run()
Blog::withoutEvents(function ()
// normally
Blog::factory()
->times(10)
->hasUploads(1) //hasOne
->hasComments(2) //hasMany
->create();
);
【讨论】:
【参考方案3】:你可以使用 saveQuietly() 函数https://laravel.com/docs/8.x/eloquent#saving-a-single-model-without-events 这允许您禁用单个模型的所有事件。
如果您想为单个模型禁用单个事件,请在此处阅读:http://derekmd.com/2019/02/conditionally-suppressing-laravel-event-listeners/
【讨论】:
以上是关于拉拉维尔。如果数据库正在播种,则禁用观察者方法的主要内容,如果未能解决你的问题,请参考以下文章