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
}
}
Не уверен, что я сделал неправильно, так как я только что установил все это после пошаговой документации...
Спасибо, ребята, за вашу помощь.
Ответы
Ответ 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_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));
}
}