Ста*_*кий 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)
您可以使用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)