Lew*_*wis 5 php segmentation-fault laravel
问题
按照我刚才的问题在这里,有人指出,我认为我不应该试图在Laravel厂(即我应该填补他们在自己的工厂),以填补相关的模型.
但是,我有一个观察者在创建过程中查找相关数据并尝试填充相关模型(这样我就可以使用create::方法和单个多步骤形式创建多个相关实体).现在,我需要添加一个检查以查看此数据是否填充在观察者中,因此我不必在工厂中指定它.
这样做,我现在在尝试为数据库设定种子时遇到分段错误.我已经将原因缩小到这一行 - 没有isset检查,它工作正常(除了$ data ['day']没有指定,因此检查);
分段故障(核心转储)
if(isset($data['day'])) $event->day->fill($data['day']);
Run Code Online (Sandbox Code Playgroud)
相关代码
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"
];
});
Run Code Online (Sandbox Code Playgroud)
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();
}
Run Code Online (Sandbox Code Playgroud)
其他信息
命令:sudo php artisan migrate:reset --seed
主持人:Windows 10
VM环境:Vagrant通过HyperV运行Ubuntu 16.04,与Samba共享安装
PHP版本:7.1.20
Laravel版本:5.7
事实证明这个问题实际上就是这条线;
$event->push();
可能会有一些递归发生的事情吗?
在Namoshek的帮助下,我现在可以将其缩小到xdebug的以下错误;
达到'256'的最大功能嵌套级别,正在中止!
将xdebug.max_nesting_level增加到200000可以恢复段错误.
在我看来,它似乎陷入无限循环.不过,我看不出打电话save()或push()在created最终会回调到自身.困惑.
这确实是一个无限递归问题.消除线路:
$event->push(); // this line appears to call update again, which in turn calls push, which calls update etc...
Run Code Online (Sandbox Code Playgroud)
解决了这个问题.