Подтвердить что ты не робот

FOS UserBundle Невозможно войти

Я вернулся с еще одной проблемой в отношении моего UserBundle: Все прекратилось при установке и настройке пакета FOS через Symfony2, он даже позволил мне создать 2 пользователей, которые были правильно вставлены в мою БД.

Однако каждый раз, когда я пытаюсь войти в одну из этих учетных записей, я получаю следующую ошибку

Warning: Erroneous data format for unserializing 'VillaPrivee\UserBundle\Entity\User' in /Users/Vianney/Projets/VillaPrivee/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php line 869

Это то, к чему относится линия 869:

/**
     * Creates a new instance of the mapped class, without invoking the constructor.
     *
     * @return object
     */
    public function newInstance()
    {
        if ($this->_prototype === null) {
            $this->_prototype = unserialize(sprintf('O:%d:"%s":0:{}', strlen($this->name), $this->name));
        }

        return clone $this->_prototype;
    }

И это мой пользовательский объект:

namespace VillaPrivee\UserBundle\Entity;

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    public function __construct()
    {
        parent::__construct();
        // your own logic
    }
}

Не уверен, что я сделал неправильно, так как я только что установил все это после пошаговой документации... Спасибо, ребята, за вашу помощь.

4b9b3361

Ответ 1

Если вы используете PHP версии 5.4.29 или 5.5.13

В: "/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php" найдите функцию "newInstance" (вокруг строки 827) и отредактируйте как указано до тех пор, пока Fix не будет сливается по доктрине.

public function newInstance()
{
    if ($this->_prototype === null) {
        // $this->_prototype = unserialize(sprintf('O:%d:"%s":0:{}', strlen($this->name), $this->name));
        if (PHP_VERSION_ID === 50429 || PHP_VERSION_ID === 50513) {
            $this->_prototype = $this->reflClass->newInstanceWithoutConstructor();
        } else {
            $this->_prototype = unserialize(sprintf('O:%d:"%s":0:{}', strlen($this->name), $this->name));
        }
    }
    return clone $this->_prototype;
}

@Benji: спасибо для подсказки: https://github.com/symfony/symfony/issues/11056

Ответ 2

Отвечая на мой собственный вопрос, я нашел обходное решение благодаря этому парню:

http://www.doctrine-project.org/jira/browse/DDC-3120

Он намного лучше меня, когда дело доходит до объяснения, но это то, что у меня есть сейчас, и это работает как шарм!:)

{
        if ($this->_prototype === null) {
            $this->_prototype = @unserialize(sprintf('O:%d:"%s":0:{}', strlen($this->name), $this->name));
            if ($this->_prototype === false) {
                $this->_prototype = @unserialize(sprintf('C:%d:"%s":0:{}', strlen($this->name), $this->name));
            }
        }

        return clone $this->_prototype;
    }

Ответ 3

  • Проверьте версию PHP на "php -v" в командной строке. Например. PHP 5.6.10

  • Отредактируйте файл /vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php::newInstance()

Добавьте сюда свой PHP_VERSION_ID

if (PHP_VERSION_ID === 50610 ) {
.
}

Это временное решение, так как мы не редактируем каталог vendor.

Ответ 4

Я столкнулся с той же проблемой с php 5.6.6 (локально с mamp), моим обходным решением было просто вернуться к 5.4, так как версия, которая у меня была на сервере в любом случае... но определенно что-то, что нужно иметь в виду...

Ответ 5

Этот код работает для меня, YourApplicationName\vendor\doctrine\lib\Doctrine\ORM\Mapping\ClassMetadataInfo.php

i замените существующий код на код ниже

If ($this->_prototype === null) {
    $this->_prototype = @unserialize(sprintf('O:%d:"%s":0:{}', strlen($this->name), $this->name));
if ($this->_prototype === false) {
    $this->_prototype = unserialize(sprintf('C:%d:"%s":0:{}', strlen($this->name), $this->name));
}
}