php Laravel,如果数据库正在播种,则禁用观察者方法

j2datikz  于 2023-11-16  发布在  PHP
关注(0)|答案(5)|浏览(87)

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

public function created(User $user)
{
    sendEmail();
}

字符串
所以,这个想法是,当一个用户被创建时,系统将向用户发送电子邮件通知,说明该帐户已创建。
问:当数据库正在播种时,它也调用这个方法'created'并向用户(种子中的用户)发送电子邮件通知。所以,我的问题是,我如何检查,可能在这个'created'方法中,如果laravel正在播种数据->不要发送电子邮件或不要运行'created' observer方法。
尝试谷歌,发现一些东西,但不工作正确.像YourModel::flushEventListeners();的东西

bkhjykvo

bkhjykvo1#

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

  • 如果您在同一执行中播种后需要它们,您可以读取分派器,取消设置它们,然后再次设置它们。
$dispatcher = YourModel::getEventDispatcher();
// Remove Dispatcher 
YourModel::unsetEventDispatcher();

// do stuff here

// Re-add Dispatcher
YourModel::setEventDispatcher($dispatcher);

字符串

mo49yndu

mo49yndu2#

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

            });

         }
    }

字符串

fjaof16o

fjaof16o3#

您可以使用WithoutModelEvents trait静音事件

use Illuminate\Database\Console\Seeds\WithoutModelEvents;

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

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

class SomeSeeder extends Seeder
{
    public function run()
    {
        User::factory( 30 )->createQuietly();
    }
}

velaa5lx

velaa5lx4#

您可以使用saveQuietly()函数https://laravel.com/docs/8.x/eloquent#saving-a-single-model-without-events这允许您禁用单个模型的所有事件。
如果你想为一个模型禁用一个事件,请在这里阅读:http://derekmd.com/2019/02/conditionally-suppressing-laravel-event-listeners/

6l7fqoea

6l7fqoea5#

您只需将其添加到数据库seeder中即可

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        activity()->disableLogging();

        Mail::fake();
        Notification::fake();

字符串

相关问题