问题
根据我之前的问题 here ,有人向我指出我不应该尝试在 Laravel 工厂中填充相关模型(即我应该在他们自己的工厂中填充它们)。
但是,我有一个观察者在创建过程中查找相关数据并尝试填充相关模型(这样我就可以仅使用 create::
方法和一个单步多步形式)。现在,我需要添加一个检查以查看此数据是否已填充到观察器中,因此我不必在工厂中指定它。
在这样做的过程中,我现在在尝试为我的数据库设置种子时遇到段错误。我已经将原因缩小到这一行 - 没有 isset
检查,它工作正常(除了 $data['day'] 没有指定,因此检查);
Segmentation fault (core dumped)
if(isset($data['day'])) $event->day->fill($data['day']);
相关代码
事件工厂.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();
}
其他信息
Command: sudo php artisan migrate:reset --seed
Host: Windows 10
VM Environment: Vagrant running Ubuntu 16.04 via HyperV, mounted share with Samba
PHP Version: 7.1.20
Laravel Version: 5.7
更新
原来问题实际上出在这一行上;
$event->push();
这里会不会发生递归的事情?
更新2
在 Namoshek 的帮助下,我现在可以将其缩小为 xdebug 中的以下错误;
Maximum function nesting level of '256' reached, aborting!
将 xdebug.max_nesting_level 增加到 200000 会恢复段错误。
在我看来,这似乎陷入了无限循环。但是,我看不出在 created
中调用 save()
或 push()
最终会回调到自身。困惑。
最佳答案
这确实是一个无限递归问题。删除行:
$event->push(); // this line appears to call update again, which in turn calls push, which calls update etc...
问题解决了。
关于php - Laravel 迁移期间的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53119568/