web-dev-qa-db-fra.com

FOS UserBundle Impossible de se connecter

Je suis de retour avec un autre problème concernant UserBundle: Tout s'est parfaitement déroulé lors de l'installation et de la configuration du bundle FOS via Symfony2, il m'a même permis de créer 2 utilisateurs correctement insérés dans ma base de données.

Cependant, chaque fois que j'essaie de me connecter à l'un de ces comptes, j'obtiens l'erreur suivante

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

C’est ce à quoi se réfère la ligne 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;
    }

Et voici mon entité utilisateur:

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
    }
}

Pas sûr de ce que j'ai fait de mal, puisque je viens d'installer le tout en suivant la documentation étape par étape ... Merci les gars pour votre aide

27
wattever

Si vous utilisez PHP version 5.4.29 ou 5.5.13

Dans: "/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php", recherchez la fonction "newInstance" (autour de la ligne 827) et modifiez-la jusqu'à ce que le correctif soit fusionné par la doctrine.

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: merci pour l'indice: https://github.com/symfony/symfony/issues/11056

38
grow

Répondant à ma propre question, j'ai trouvé une solution de contournement grâce à ce type: 

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

Il est bien meilleur que moi quand il s'agit d'expliquer, mais c'est ce que j'ai maintenant et ça fonctionne à merveille! :)

{
        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;
    }
18
wattever
  1. Vérifiez votre version PHP par "php -v" en ligne de commande. Par exemple. PHP 5.6.10

  2. Editez le fichier /vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php::newInstance ().

Ajoutez votre PHP_VERSION_ID ici 

if (PHP_VERSION_ID === 50610 ) {
.
}

C'est une solution temporaire, car nous n'éditons pas le répertoire vendor.

3
SiteTester

J'ai eu le même problème avec php 5.6.6 (localement avec mamp), ma solution de contournement consistait simplement à revenir à la version 5.4, car c'est la version que j'avais en cours d'exécution sur le serveur de toute façon ... mais il faut vraiment garder à l'esprit ...

1
AlexK

Ce code fonctionne pour moi, YourApplicationName\vendor\doctrine\lib\Doctrine\ORM\Mapping\ClassMetadataInfo.php 

je remplace le code existant par le code ci-dessous

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));
}
}
0
Mohammad Fareed