我在observer
的启动方法中注册了AppServiceProvider
。
然后,当某项工作完成时,我用Queue::after
听。
问题在于,当我在foreach循环中创建ProjectUserAssignments
时,不会触发观察者!但是它们是在数据库中正确制作的。
它看起来像这样:
ProjectUserAssignment::observe(ProjectUserAssignmentObserver::class);
Queue::after(function(JobProcessed $event) {
//When a project is created, create the employees and send to harvest.
if($event->job->resolveName() == HarvestProjectCreate::class) {
\Log::debug('start!');
$project = Project::latest()->first();
foreach($project->team->employees as $employee) {
ProjectUserAssignment::create([
'project_id' => $project->id,
'user_id' => $employee->id,
'is_project_manager' => false
]);
}
}
});
当我分别使1 ProjectUserAssignment
时,将触发观察者!这可能是怎么回事?
答案 0 :(得分:0)
我也遇到观察者触发created
的问题,但对Laravel仍然不太坚定。
我无法提供真正的答案是什么问题,但提示了在哪里调试。
添加dd()
或Log::info()
调用以查看是否实际触发了您应用中的方法。
这不限于您的代码库。有时您需要查看内部信息。
位置:Illuminate\Database\Eloquent\Concerns\HasEvents
HasEvents::observe()
-$classes
参数也应列出您的参数。HasEvents::registerObserver()
-调试foreach以查看是否实际上不存在某些事件。HasEvents::fireModelEvent()
-当发生模型事件(例如创建,更新等)时,从Laravel的基础Model
进行调用。如果一切正确,则应从此处召唤您的观察员。HasEvents::withoutEvents()
-请注意,自动测试可能会在没有模型事件的情况下运行。如果使用特征Illuminate\Foundation\Testing\TestCase
,WithoutEvents
会这样做。位置:Illuminate\Database\Eloquent\Model
Model::performInsert()
-插入数据库('creating'
,'created'
)Model::performUpdate()
-更新数据库中的记录('updating'
,'updated'
)Model::delete()
-从数据库中删除记录('deleting'
,'deleted'
)fireModelEvent()
通话-这里也会触发其他事件,如果您感兴趣的话,可以Ctrl
+ F
结束如果其他所有方法均失败,请检查文件,类和方法,名称空间的拼写。
特别有用,如果您已经为其他Laravel版本手写了一些类/方法或复制粘贴了代码。不得不提一下,以防万一。
可悲的是,这经常是问题的根源。 Laravel开发团队可能需要付出其他所有代价。如果您有一个示例项目可以对此进行测试。
答案 1 :(得分:0)
在Laravel文档中提到,诸如create之类的质量分配方法不会触发诸如观察者之类的事件。
您必须更改为普通插入
$p = new ProjectUserAssignment;
$p->project_id = $project->id;
$p->user_id = $employee->id;
$p->is_project_manager = false;
$p->save();
unset($p) // do this when done in loop to avoid memory shortage