0

FOSUserBundle に問題があります。既知の問題: ログインしようとすると、「認識されないフィールド: symfony2 FosUserbundle の usernameCanonical」

スキーマの更新時に、次のエラーが発生します。

Duplicate definition of column 'username' on entity 'Acme\ProjectBundle\Entity\User' in a field or discriminator column mapping. 

config.yml の教義のマッピングの設定に「FOSUserBundle: ~」を追加した場合にのみ、このエラーが発生します。

私は多くの解決策を試しましたが、問題を解決していません:/助けてください。

FOS のチームをフォローしました: https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/index.md

すべてが完全に機能する前に...

私はSymfony 2.1.9を持っています

私のconfig.yml:

doctrine:
dbal:
    default_connection: default
    connections:
        default:
            driver:   "%database_driver%"
            host:     "%database_host%"
            port:     "%database_port%"
            dbname:   "%database_name%"
            user:     "%database_user%"
            password: "%database_password%"
            charset:  UTF8
        service:
            driver:   "%database_driver2%"
            host:     "%database_host2%"
            port:     "%database_port2%"
            dbname:   "%database_name2%"
            user:     "%database_user2%"
            password: "%database_password2%"
            charset:  UTF8
orm:
    auto_generate_proxy_classes: "%kernel.debug%"
    #auto_mapping: true
    default_entity_manager: default
    entity_managers:
        default:
            metadata_cache_driver: apc
            result_cache_driver: apc
            query_cache_driver: apc
            connection: default
            mappings:
                FOSUserBundle: ~
                AcmeProjectBundle: {type: yml, dir: Resources/config/doctrine/ } #also tried wit '~'
fos_user:
    db_driver: orm # other valid values are 'mongodb', 'couchdb' and 'propel'
    firewall_name: main
    user_class: Acme\ProjectBundle\Entity\User

私の Acme\ProjectBundle\Entity\User.php:

namespace Acme\ProjectBundle\Entity;

 use FOS\UserBundle\Entity\User as BaseUser;
 use Doctrine\ORM\Mapping as ORM;
 use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
 use Symfony\Component\Validator\Constraints as Assert;
 use Symfony\Component\Security\Core\User\UserInterface;


 class User extends BaseUser implements UserInterface, \Serializable
 {
      const TYPE_ADMIN        = 0;
      const TYPE_USER         = 2;
      const TYPE_ARTIST       = 3;

/**
 * @var string $salt
 */
protected $salt;

/**
 * @var boolean $is_active
 */
private $is_active;
protected $id;


private $name;


protected $username;

protected $email;

/**
 * @var tinyint $type
 */
private $type;


protected $password;


private $description;


/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}

/**
 * Set name
 *
 * @param string $name
 * @return User
 */
public function setName($name)
{
    $this->name = $name;

    return $this;
}

/**
 * Get name
 *
 * @return string 
 */
public function getName()
{
    return $this->name;
}

/**
 * Set type
 *
 * @param integer $type
 * @return User
 */
public function setType($type)
{
    $this->type = $type;

    return $this;
}

/**
 * Get type
 *
 * @return integer 
 */
public function getType()
{
    return $this->type;
}

/**
 * Set description
 *
 * @param string $description
 * @return User
 */
public function setDescription($description)
{
    $this->description = $description;

    return $this;
}

/**
 * Get description
 *
 * @return string 
 */
public function getDescription()
{
    return $this->description;
}

/**
 * Set username
 *
 * @param string $username
 * @return User
 */
public function setUsername($username)
{
    $this->username = $username;

    return $this;
}

/**
 * Get username
 *
 * @return string 
 */
public function getUsername()
{
    return $this->username;
}

/**
 * Set password
 *
 * @param string $password
 * @return User
 */
public function setPassword($password)
{
    $this->password = $password;

    return $this;
}

/**
 * Get password
 *
 * @return string 
 */
public function getPassword()
{
    return $this->password;
}

/**
 * Set email
 *
 * @param string $email
 * @return User
 */
public function setEmail($email)
{
    $this->email = $email;

    return $this;
}

/**
 * Get email
 *
 * @return string 
 */
public function getEmail()
{
    return $this->email;
}




public function isPasswordName()
{
    return ($this->name != $this->password);
}

public function isPassUsername()
{
    return ($this->password != $this->username);
}
/**
 * @var \DateTime $date
 */
private $date;


/**
 * Set date
 *
 * @param \DateTime $date
 * @return User
 */
public function setDate($date)
{
    $this->date = $date;

    return $this;
}

/**
 * Get date
 *
 * @return \DateTime 
 */
public function getDate()
{
    return $this->date;
}


private $updateDate;


/**
 * Set updateDate
 *
 * @param \DateTime $updateDate
 * @return User
 */
public function setUpdateDate($updateDate)
{
    $this->updateDate = $updateDate;

    return $this;
}

/**
 * Get updateDate
 *
 * @return \DateTime 
 */
public function getUpdateDate()
{
    return $this->updateDate;
}



public function setIsActive($value)
{
    $this->is_active = $value;

    return $this;
}

public function gettIsActive()
{
    return $this->is_active;

    return $this;
}


/**
 * Set salt
 *
 * @param string $salt
 * @return User
 */
public function setSalt($salt)
{
    $this->salt = $salt;

    return $this;
}

/**
 * Get salt
 *
 * @return string 
 */
public function getSalt()
{
    return $this->salt;
}


/**
 * @inheritDoc
 */
public function eraseCredentials()
{
}


public function __construct()
{
parent::__construct();
    $this->isActive = true;
    $this->salt = md5(uniqid(null, true));
}


public function getRoles()
{
    switch ($this->getType())
    {
            case 0:
                    return array('ROLE_ADMIN');
                    break;
            case 1:
            case 2:
            case 3:
                    return array('ROLE_USER');
                    break;

    }


}

/**
 * @see \Serializable::serialize()
 */
public function serialize()
{
    return serialize(array(
                    $this->id,
    ));
}

/**
 * @see \Serializable::unserialize()
 */
public function unserialize($serialized)
{
    list (
                    $this->id,
    ) = unserialize($serialized);
}
/**
 * @var integer $first_login
 */
private $first_login;


/**
 * Get is_active
 *
 * @return boolean 
 */
public function getIsActive()
{
    return $this->is_active;
}

/**
 * Set first_login
 *
 * @param integer $firstLogin
 * @return User
 */
public function setFirstLogin($firstLogin)
{
    $this->first_login = $firstLogin;

    return $this;
}

/**
 * Get first_login
 *
 * @return integer 
 */
public function getFirstLogin()
{
    return $this->first_login;
}
/**
 * @var \Doctrine\Common\Collections\ArrayCollection
 */
private $userPoints;





/**
 * @var integer $privacy
 */
private $privacy;


/**
 * Set privacy
 *
 * @param integer $privacy
 * @return User
 */
public function setPrivacy($privacy)
{
    $this->privacy = $privacy;

    return $this;
}

/**
 * Get privacy
 *
 * @return integer 
 */
public function getPrivacy()
{
    return $this->privacy;
}
/**
 * @var integer
 */
private $enable;


/**
 * Set enable
 *
 * @param integer $enable
 * @return User
 */
public function setEnable($enable)
{
    $this->enable = $enable;

    return $this;
}

/**
 * Get enable
 *
 * @return integer 
 */
public function getEnable()
{
    return $this->enable;
}
}

私のsecurity.yml

security:
firewalls:
    main:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            login_path: /login
            use_forward: false
            check_path: /login_check
            csrf_provider: form.csrf_provider
        logout:       true
        anonymous:    true
providers:
    fos_userbundle:
        id: fos_user.user_provider.username

encoders:
    FOS\UserBundle\Model\UserInterface: sha512

role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_ADMIN

access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin/, role: ROLE_ADMIN }
4

5 に答える 5

2

使用クラスの作成に関するドキュメントを確認してください: https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/index.md

User クラスは、基本クラスのすべてのプロパティ (ユーザー名など) を繰り返さないようにする必要があります。name や id などの新しいプロパティのみを持つ必要があります。

ドクトリン マッピング ファイルを表示していませんが、そこにあるすべてのファイルが複製されている可能性が高いのではないでしょうか? 新しいプロパティのみをマップします。

于 2013-03-29T13:53:13.940 に答える
1

実際、config.yml に次のようなコードが必要だと思います。

fos_user:  
    db_driver: orm # other valid values are 'mongodb', 'couchdb' and 'propel'
    firewall_name: main  
    user_class: Acme\ProjectBundle\Entity\User

sth を追加する必要はありません。ormFOSUser の設定に。

于 2013-03-29T13:42:57.680 に答える
0
orm:
    auto_generate_proxy_classes: "%kernel.debug%"
    #auto_mapping: true
    default_entity_manager: default
    entity_managers:
       default:            
          // that's for APCu or APC
          metadata_cache_driver: apc
          result_cache_driver: apc
          query_cache_driver: apc

dev env APC が無効になっているため、このエラーが発生します。開発用にコメントするか、cacheClassLoader を有効にする必要があります

于 2014-09-21T10:36:59.080 に答える
0

私はこの問題を抱えていて、PieroWbmstr の提案を適用し、1.3.6 の代わりに 2.0 を使い始めました... config.yml で doctrine.orm.auto_mapping を true に設定しました

composer.json のバージョンを切り替えてアップグレードすると、doctrine:schema:update は新しいフィールドが現在のデータベース インスタンスにないことを即座に認識し、それらを適用しました。

FOS/UserBundle 内の新しいバージョンのユーザー クラスには、マッピングを適切に実行させるような重要な変更はないようです。これらの 2 つのバージョンの違いを知っている人はいますか? または、より直接的には、なぜ古いバージョンでは xml マッピングであることを doctrine に認識させなかったのか (ヒント: 私の FOS/UserBundle バージョンの両方で、アノテーションを使用するようにローカル カスタム バンドルを設定していました)。

ありがとう

于 2015-07-01T11:45:37.060 に答える