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

Ста*_*кий 16 php database observers laravel laravel-seeding

我的用户模型有一个观察者。在我的观察者->创建的事件中我有一些代码。

public function created(User $user)
{
    sendEmail();
}
Run Code Online (Sandbox Code Playgroud)

因此,我们的想法是,当创建用户时,系统将向用户发送帐户已创建的电子邮件通知。

问题:当数据库进行播种时,它还会调用此方法“已创建”并向用户(位于种子中)发送电子邮件通知。所以,我的问题是,我如何检查,可能在这个“创建”方法中,目前 Laravel 正在播种数据 -> 不发送电子邮件或不运行“创建”观察者方法。

尝试谷歌,找到了一些东西,但工作不正确。就像是YourModel::flushEventListeners();

Jul*_*n S 26

您可以使用YourModel::unsetEventDispatcher();临时删除模型的事件侦听器。

如果您在同一执行中播种后需要它们,您可以读取调度程序,取消设置它们,然后再次设置它们。

$dispatcher = YourModel::getEventDispatcher();
// Remove Dispatcher 
YourModel::unsetEventDispatcher();

// do stuff here

// Re-add Dispatcher
YourModel::setEventDispatcher($dispatcher);
Run Code Online (Sandbox Code Playgroud)


小智 11

 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();

            });


         }
    }
Run Code Online (Sandbox Code Playgroud)


Iha*_*nka 9

您可以使用WithoutModelEvents 特质来静音事件

use Illuminate\Database\Console\Seeds\WithoutModelEvents;

class SomeSeeder extends Seeder
{
    use WithoutModelEvents;
    
    public function run()
    {
        User::factory( 30 )->create();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者你可以尝试createQuietly工厂的方法,例如

class SomeSeeder extends Seeder
{
    public function run()
    {
        User::factory( 30 )->createQuietly();
    }
}
Run Code Online (Sandbox Code Playgroud)