问题
根据我之前的问题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();
这里会发生递归吗?
在Namoshek的帮助下,我现在可以将其缩小到xdebug中的以下错误;
达到最大的函数嵌套级别'256',正在中止!
将xdebug.max_nesting_level增加到200000会导致段错误。
在我看来,这就像陷入了无限循环。但是,我看不到在save()
中调用push()
或created
最终会回叫自己。困惑。
答案 0 :(得分:7)
这确实确实是一个无限递归问题。消除该行:
$event->push(); // this line appears to call update again, which in turn calls push, which calls update etc...
解决了问题。