拉拉维尔。如果数据库正在播种,则禁用观察者方法

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/

【讨论】:

以上是关于拉拉维尔。如果数据库正在播种,则禁用观察者方法的主要内容,如果未能解决你的问题,请参考以下文章

拉拉维尔 |大量数据的特殊验证

数据库中存在名称?拉拉维尔

拉拉维尔。从 SQL SERVER 检索图像。数据类型:图片

基于关系数据的查询 |拉拉维尔 5.4

方法保存不存在。拉拉维尔

如何限制数据透视表的访问?拉拉维尔