Php 未触发Laravel观测器
我在Php 未触发Laravel观测器,php,laravel,queue,observers,Php,Laravel,Queue,Observers,我在AppServiceProvider的引导方法中注册了一个observer 然后,当某项工作完成时,我用Queue::after收听 问题是,当我在foreach循环中创建ProjectUserAssignments时,观察者不会被触发!但它们是在数据库中正确生成的 看起来是这样的: ProjectUserAssignment::observe(ProjectUserAssignmentObserver::class); Queue::after(function(JobProcessed
AppServiceProvider
的引导方法中注册了一个observer
然后,当某项工作完成时,我用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
时,将触发观察者!这里可能发生了什么?我也遇到了在创建的上触发观察者的问题,但对Laravel仍然不是很坚定。
我无法提供问题的真实答案,但提供了调试位置的提示
添加dd()
或Log::info()
调用,查看是否实际触发了应用程序中的方法。
这并不局限于您的代码库。有时,您需要查看内部结构
HasEvents
位置:illumb\Database\elount\Concerns\HasEvents
HasEvents::observe()
-$classes
参数也应该列出您的类
HasEvents::registerObserver()
-调试foreach以查看某个事件是否实际存在
HasEvents::fireModelEvent()
-当模型事件发生时(例如创建、更新等),从Laravel的基础模型
调用此函数。如果一切正常,应该从这里呼叫您的观察者
HasEvents::withoutEvents()
-请注意,自动测试可能在没有模型事件的情况下运行<如果使用traitWithoutEvents
,则代码>照亮\基础\测试\测试用例会这样做
模型
位置:illumb\Database\elount\Model
Model::performInsert()
-插入数据库(“创建”
,“创建”
)
Model::performUpdate()
-更新数据库中的记录(“更新”
,“更新”
)
Model::delete()
-从数据库中删除记录(“删除”
,“删除”
)
fireModelEvent()
调用-如果您感兴趣,也会在此处触发其他事件,Ctrl
+F
您的方法
打字错误
如果所有其他操作都失败,请检查文件、类和方法、命名空间的拼写
如果您已经为另一个Laravel版本手工编写了一些类/方法或复制粘贴了代码,那么这一点尤其重要。我得提一下,以防万一
不幸的是,这往往是问题的根源。
其他一切可能都值得一张Laravel开发团队的门票。如果您有一个示例项目来测试这一点。Laravel文档中提到,create等质量分配方法不会触发observer等事件
您必须更改为正常插入,如
$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
它是否真的记录了“开始!”还可以在foreach循环中放入Log::debug以确保它也达到这个目的吗?我想问一下这个问题。我在表单submit上创建了一个模型,它触发了observer:created方法。但是,当我通过作业创建相同的模型时,它不会触发。这是已知的bug吗?或者有已知的工作吗?我也有同样的问题。为了避免这种情况,我把整个观察者都转移到工作中去了。我相信有一只虫子。同时,我认为create方法不会因为批量操作而触发observer