Laravel观察者未触发

时间:2018-12-17 08:18:02

标签: php laravel queue observers

我在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时,将触发观察者!这可能是怎么回事?

2 个答案:

答案 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\TestCaseWithoutEvents会这样做。

型号

位置: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