Warning: Erroneous data format for unserializing ‘App\UserBundle\Entity\User’

Ошибка Doctrine 2 с FOS\UserBundle. Воспроизводится на PHP 5.6 при использовании FOS/UserBundle для Symfony и старой версии доктрины 2.3.х.

Лог такой:


Warning: Erroneous data format for unserializing 'App\UserBundle\Entity\User' in project/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php

Я нашел два способа исправления.

Обновить версию Doctrine

Обновить Doctrine до версии 2.4.x или выше. Однако не всегда это допустимо, в силу того, что что-нибудь может отвалиться. А исправить нужно здесь и сейчас 🙂

Изменить способ создания объекта без конструктора

Собственно причина проблемы – это способ, который использует Doctrine для создания объекта без вызова конструктора – десериализация данных.
Можно исправить метод newInstance() и создавать объект через рефлексию.


function newInstance()
{
    if ($this->_prototype === null) {
        if (method_exists($this->reflClass, 'newInstanceWithoutConstructor')) {
            $this->_prototype = $this->reflClass->newInstanceWithoutConstructor();
        } else {
            $this->_prototype = unserialize(sprintf('O:%d:"%s":0:{}', strlen($this->name), $this->name));
        }
    }

    return clone $this->_prototype;
}

Stas Kuryan

IT entrepreneur / Product Owner / Engineer - Готов к худшему, в надежде на лучшее.

1 Comment

  1. Я тоже частенько сталкиваю с подобного рода ошибками. Благо, что есть люди, которые помогают с их решить. 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *