FOS UserBundle 无法登录
Posted
技术标签:
【中文标题】FOS UserBundle 无法登录【英文标题】:FOS UserBundle Unable to login 【发布时间】:2014-07-24 17:25:53 【问题描述】:我又遇到了关于我的 UserBundle 的另一个问题: 通过 Symfony2 安装和配置 FOS 包时一切都很完美,它甚至让我创建了 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 行附近)并按如下进行编辑,直到修复按教义合并。
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
【讨论】:
或者只是升级你的 PHP 版本来解决这个问题。我将 fra 5.4.29 升级到 5.4.30,这使得一切都按预期工作:) 这也是 PHP 5.6 分支的问题。如您所见,Doctrine 2.4.6 已解决此问题。 是的。确认 5.6 上的问题 :) Debian 不稳定 - 5.6.2+dfsg-1 版本。必须为我的版本添加 PHP_VERSION_ID === 50602。 不错!!PHP 5.6.7-1 (cli) (built: Mar 24 2015 12:30:15)
在这里我尝试了第一个建议 doctrine-project.org/jira/browse/DDC-3120 没有运气。将 O 更改为 C 会产生空字符串并在需要数组的 User::unserialize() 中崩溃。
PHP_VERSION_ID === 50609
用于 PHP 5.6.9-0+deb8u1【参考方案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;
【讨论】:
我在PHP 5.6.3
上也遇到了同样的错误,但我认为这不会解决问题。我们知道,在 PHP 中,当 @ 符号作为表达式的前缀时,该表达式可能生成的任何错误消息都将被忽略。见php.net/manual/en/language.operators.errorcontrol.php【参考方案3】:
通过命令行中的“php -v”检查您的 PHP 版本。例如。 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
我用下面的代码替换现有的代码
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));
【讨论】:
以上是关于FOS UserBundle 无法登录的主要内容,如果未能解决你的问题,请参考以下文章
Symfony 4/JMS/FOSUser:无法从 FOS\UserBundle 序列化数据
Symfony 2 FOS 用户捆绑引导模式 AJAX 登录
显示配置文件 FOS UserBundle + Sonata UserBundle
服务“security.authentication.manager”依赖于不存在的服务“security.user.provider.concrete.fos_userbundle”