Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 未触发Laravel观测器_Php_Laravel_Queue_Observers - Fatal编程技术网

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()
    -请注意,自动测试可能在没有模型事件的情况下运行<如果使用trait
    WithoutEvents
    ,则代码>照亮\基础\测试\测试用例会这样做
模型 位置:
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