Laravel迁移期间出现分段错误

时间:2018-11-02 13:34:12

标签: php laravel segmentation-fault

问题

enter image description here

根据我之前的问题here,有人向我指出,我不应该尝试在Laravel工厂中填充相关模型(即,我应该在自己的工厂中填充相关模型)。

但是,我有一个观察者,它在创建过程中查找相关数据并尝试填充相关模型(这样,我可以仅使用create::方法和一个多步骤表单来创建多个相关实体)。现在,我需要添加检查以查看观察器中是否填充了此数据,因此我不必在工厂中指定它。

这样做,我现在在尝试播种数据库时遇到分段错误。我将原因缩小到这一行-没有进行isset检查,它就可以正常工作(除了未指定$ data ['day']之外,因此进行了检查);

  

分段错误(核心已转储)

if(isset($data['day'])) $event->day->fill($data['day']);

相关代码

EventFactory.php

$factory->define(App\Event::class, function (Faker $faker) {
    return [
        "name"                        => "A Test Event",
        "description"                 => $faker->paragraphs(3, true),
        "event_start_date"            => today(),
        "event_opening_date"          => today(),
        "event_closing_date"          => tomorrow(),
        "user_id"                     => 1,
        "banner_id"                   => 1,
        "gallery_id"                  => 1,
        "related_event_id"            => 1,
        "status"                      => "published",
        "purchase_limit"              => 1000,
        "limit_remaining"             => 1000,
        "delivery_method"             => "collection",
        "merchandise_delivery_method" => "collection"
    ];
});

EventObserver.php

public function created($event){
        # get all attributes
        $data = $event->getAttributes();

        # fill any related models
        if(isset($data['day'])) $event->day->fill($data['day']);

        # save user
        $event->push();
    }

public function updating($model){
        # get all attributes
        $data = $model->getAttributes();

        # fill any related models
        if(isset($data['day'])) $model->day->fill($data['day']);

        # save user
        $model->push();
    }

其他信息

  

命令:sudo php artisan migration:reset --seed

     

主机:Windows 10

     

VM环境:流浪者通过HyperV运行Ubuntu 16.04,并与Samba挂载共享

     

PHP版本:7.1.20

     

Laravel版本:5.7

更新

原来问题出在这行上;

$event->push();

这里会发生递归吗?

更新2

在Namoshek的帮助下,我现在可以将其缩小到xdebug中的以下错误;

  

达到最大的函数嵌套级别'256',正在中止!

将xdebug.max_nesting_level增加到200000会导致段错误。

在我看来,这就像陷入了无限循环。但是,我看不到在save()中调用push()created最终会回叫自己。困惑。

1 个答案:

答案 0 :(得分:7)

这确实确实是一个无限递归问题。消除该行:

$event->push(); // this line appears to call update again, which in turn calls push, which calls update etc...

解决了问题。