学说没有;t映射FOSUserBundle用户类中的字段


Doctrine doesn't map fields from FOSUserBundle User class

我在运行PHP 5.3.13的Windows服务器上使用Symfony 2.1 RC1FOSUserbundle

我遵循了这里的说明,但Doctrine不会在数据库中为从基本FOS User类继承的属性创建字段(仅为我的类中的字段)。

尝试使用FOS登录表单登录会产生错误:

Unrecognized field: usernameCanonical

我有以下条令配置:

# Doctrine Configuration
doctrine:
    dbal:
        driver:   %database_driver%
        host:     %database_host%
        port:     %database_port%
        dbname:   %database_name%
        user:     %database_user%
        password: %database_password%
        charset:  UTF8
    orm:
        auto_generate_proxy_classes: %kernel.debug%
        auto_mapping: true

FOSUserBundle配置看起来像:

fos_user:
    db_driver: orm
    firewall_name: main
    user_class: SP'PickList'UserBundle'Entity'User

我的用户实体:

namespace SP'PickList'UserBundle'Entity;
use Doctrine'ORM'Mapping as ORM;
use FOS'UserBundle'Document'User as BaseUser;
/**
 * SP'PickList'UserBundle'Entity'User
 *
 * @ORM'Table(name="fos_user")
 * @ORM'Entity
 */
class User extends BaseUser
{
    /**
     * @var integer $id
     *
     * @ORM'Column(name="id", type="integer")
     * @ORM'Id
     * @ORM'GeneratedValue(strategy="AUTO")
     */
    protected $id;

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

感谢您的帮助,

James Bench

你似乎在混合ORM和ODM的指令,如果你根据配置使用Doctrine ORM,你的User类必须扩展FOS'UserBundle'Entity'User,尝试将use语句更改为

use FOS'UserBundle'Entity'User as BaseUser;

为某人节省一些时间。不要忘记,如果您在config.yml中的ORM配置中没有使用auto_mapping,则需要将"FOSUserBundle:~"添加到映射中。

此外,您必须指定将在app/config/config.yml 中使用的实体用户类

# FOS
fos-user: 
    db_driver: orm
    firewall_name: main #optional
    user_class: FOS'UserBundle'Entity'User

我使用的是fosuserbundle的v2.1.2版本,我的User类是

use FOS'UserBundle'Model'User as BaseUser;
class Nutzer extends BaseUser {...}

我的config.yml看起来像

orm:
    default_entity_manager: default
    entity_managers:
        default:
            connection: postgres
            naming_strategy: doctrine.orm.naming_strategy.underscore
            mappings:
                AppBundle: ~ 
        my:
            connection: mysql
            naming_strategy: doctrine.orm.naming_strategy.underscore
            mappings:
                AppBundle: ~
                FOSUserBundle: ~ #this line does not change anything if left out
        ms:
            connection: mssql
            naming_strategy: doctrine.orm.naming_strategy.underscore
            mappings:
               AppBundle: ~

仍然只有这个SQL被创建(当使用--em=my创建模式时):

CREATE TABLE nutzer (id INT AUTO_INCREMENT NOT NULL, supervisor_id INT DEFAULT NULL, api_key VARCHAR(64) DEFAULT NULL, INDEX IDX_A9B4F58919E9AC5F (supervisor_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB;

所以所有的基本字段都不见了!

映射FOSUserBundle: ~中的行不会更改任何内容。

但是对于postgresql和mssql实体管理器,一切都正常!

例如,对于postgres:

CREATE TABLE nutzer (id INT NOT NULL, supervisor_id INT DEFAULT NULL, username VARCHAR(180) NOT NULL, username_canonical VARCHAR(180) NOT NULL, email VARCHAR(180) NOT NULL, email_canonical VARCHAR(180) NOT NULL, enabled BOOLEAN NOT NULL, salt VARCHAR(255) DEFAULT NULL, password VARCHAR(255) NOT NULL, last_login TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, confirmation_token VARCHAR(180) DEFAULT NULL, password_requested_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, roles TEXT NOT NULL, api_key VARCHAR(64) DEFAULT NULL, PRIMARY KEY(id))'