web-dev-qa-db-ja.com

FOS UserBundleログインできません

UserBundleに関して別の問題が発生しました。Symfony2を使用してFOSバンドルをインストールおよび構成しているときにすべてが完璧になり、DBに適切に挿入された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
    }
}

ステップバイステップのドキュメントに従って全体をインストールしただけなので、何が間違っていたのかわかりません...ご協力ありがとうございます

27
wattever

PHPバージョン5.4.29または5.5.13を使用している場合

In: "/ vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php" find function "newInstance"(827行目あたり)そして、修正が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;
}

@ベンジ:ヒントのthx: https://github.com/symfony/symfony/issues/11056

38
grow

私自身の質問に答えて、私はこの男のおかげで回避策を見つけました:

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

説明に関しては彼は私よりはるかに優れていますが、これは私が今持っているものであり、魅力のように機能します! :)

{
        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. コマンドラインでPHP version by "php -v"で確認してください。例PHP 5.6.10

  2. /vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php::newInstance()ファイルを編集します

ここにPHP_VERSION_IDを追加

if (PHP_VERSION_ID === 50610 ) {
.
}

vendorディレクトリを編集しないため、これは一時的な解決策です。

3
R Sun

私はphp 5.6.6(ローカルでmampを使用)で同じ問題を経験しましたが、私の回避策は5.4に戻ることでした。それはとにかくサーバーで実行していたバージョンだからです...しかし、間違いなく覚えておくべきことは...

1
AlexK

このコードは私のために機能します、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));
}
}
0
Mohammad Fareed