Ошибка сегментации во время миграции Laravel - PullRequest
0 голосов
/ 02 ноября 2018

Проблема

enter image description 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 migrate: reset --seed

Хост: Windows 10

Среда VM: Vagrant работает под управлением Ubuntu 16.04 через HyperV, смонтированный общий ресурс с Samba

Версия PHP: 7.1.20

Laravel Версия: 5.7

Обновление

Оказывается, проблема действительно в этой строке;

$event->push();

Может ли здесь быть что-то рекурсивное?

Обновление 2

С помощью Намошека теперь я могу сузить его до следующей ошибки из xdebug;

Достигнут максимальный уровень вложенности функции «256», прерывание!

Увеличение значения xdebug.max_nesting_level до 200000 возвращает ошибку segfault.

Мне кажется, это застряло в бесконечном цикле. Тем не менее, я не вижу, как вызов save() или push() в created в конечном итоге перезвонит самому себе. Confused.

1 Ответ

0 голосов
/ 28 февраля 2019

Это действительно оказалось проблемой бесконечной рекурсии. Ликвидация линии:

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

Решил проблему.

...