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

如何自定义 FOS UserBundle URL

服务“security.authentication.manager”依赖于不存在的服务“security.user.provider.concrete.fos_userbundle”

symfony2:使用 fosuserbundle 登录后使用引用