Php 迁移到FOSUserBundle

Php 迁移到FOSUserBundle,php,symfony,fosuserbundle,Php,Symfony,Fosuserbundle,到目前为止,我们一直在使用Symfony2中的自定义身份验证系统。我们现在正在扩展我们的功能,FOSUserBundle将成为一个节省时间的平台 我已经用Composer安装了FOSUserBundle,并将其添加到appKernel.php中 关于实体,由于已经存在一个用户实体,我刚刚删除了FOS捆绑包中AbstractUser实体已经存在的字段,并对其进行了扩展: use FOS\UserBundle\Entity\User as BaseUser; ... class User exten

到目前为止,我们一直在使用Symfony2中的自定义身份验证系统。我们现在正在扩展我们的功能,FOSUserBundle将成为一个节省时间的平台

我已经用Composer安装了FOSUserBundle,并将其添加到appKernel.php中

关于实体,由于已经存在一个用户实体,我刚刚删除了FOS捆绑包中AbstractUser实体已经存在的字段,并对其进行了扩展:

use FOS\UserBundle\Entity\User as BaseUser;
...
class User extends BaseUser
我将使用条令更新模式:schema:update--force并获得以下结果:

  [Doctrine\DBAL\Schema\SchemaException]                 
  The table with name 'lifemirror.user' already exists. 
是的,用户表已经存在,但是该命令应该会更新它。我更改用户实体中的表名,并执行
--dump sql
以查看发生了什么,它似乎保留了表,但删除了结构:

ALTER TABLE user DROP email, DROP username, DROP password, DROP invitation_code, DROP picture_file;
所以我认为用户实体可能在其他地方使用,但我不确定在哪里

在Pazi的建议下,我安装了doctrine migrations捆绑包,并尝试创建一个MGM。它生成以下内容

/**
 * Auto-generated Migration: Please modify to your need!
 */
class Version20130701134939 extends AbstractMigration
{
    public function up(Schema $schema)
    {
        // this up() migration is autogenerated, please modify it to your needs
        $this->abortIf($this->connection->getDatabasePlatform()->getName() != "mysql");

        $this->addSql("CREATE TABLE film_today (id INT AUTO_INCREMENT NOT NULL, title VARCHAR(255) DEFAULT NULL, description LONGTEXT DEFAULT NULL, id_user INT DEFAULT NULL, suggest_date DATE DEFAULT NULL, PRIMARY KEY(id)) DEFAULT CHA$
        $this->addSql("CREATE TABLE user1 (id INT AUTO_INCREMENT NOT NULL, firstname VARCHAR(255) DEFAULT NULL, lastname VARCHAR(255) DEFAULT NULL, country VARCHAR(255) DEFAULT NULL, birthdate DATE DEFAULT NULL, PRIMARY KEY(id)) DEFAU$
        $this->addSql("DROP TABLE cinema");
        $this->addSql("DROP INDEX id_user ON session");
        $this->addSql("ALTER TABLE job CHANGE id id INT AUTO_INCREMENT NOT NULL, CHANGE cinema cinema INT NOT NULL, CHANGE name name LONGTEXT NOT NULL, CHANGE status status VARCHAR(10) NOT NULL");
        $this->addSql("ALTER TABLE film_location CHANGE screening_description screening_description VARCHAR(255) DEFAULT NULL");
        $this->addSql("ALTER TABLE report_film CHANGE id_user id_user INT DEFAULT NULL, CHANGE id_film id_film INT DEFAULT NULL");
        $this->addSql("DROP INDEX email ON user");
        $this->addSql("ALTER TABLE user DROP email, DROP username, DROP password, DROP invitation_code, DROP picture_file");
        $this->addSql("ALTER TABLE film_today_vote CHANGE id id INT AUTO_INCREMENT NOT NULL, CHANGE id_film_today id_film_today INT DEFAULT NULL, CHANGE id_user id_user INT DEFAULT NULL, CHANGE vote_date vote_date DATE DEFAULT NULL");
        $this->addSql("ALTER TABLE video CHANGE timestamp timestamp DATETIME NOT NULL");
    }

    public function down(Schema $schema)
    {
        // this down() migration is autogenerated, please modify it to your needs
        $this->abortIf($this->connection->getDatabasePlatform()->getName() != "mysql");

        $this->addSql("CREATE TABLE cinema (id INT AUTO_INCREMENT NOT NULL, username LONGTEXT NOT NULL, usernameCanonical LONGTEXT NOT NULL, email LONGTEXT NOT NULL, password LONGTEXT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET u$
        $this->addSql("DROP TABLE film_today");
        $this->addSql("DROP TABLE user1");
        $this->addSql("ALTER TABLE film_location CHANGE screening_description screening_description LONGTEXT NOT NULL");
        $this->addSql("ALTER TABLE film_today_vote CHANGE id id INT NOT NULL, CHANGE id_film_today id_film_today INT NOT NULL, CHANGE id_user id_user INT NOT NULL, CHANGE vote_date vote_date DATETIME NOT NULL");
        $this->addSql("ALTER TABLE job CHANGE id id INT UNSIGNED AUTO_INCREMENT NOT NULL, CHANGE cinema cinema INT UNSIGNED NOT NULL, CHANGE name name LONGTEXT DEFAULT NULL, CHANGE status status VARCHAR(255) NOT NULL");
        $this->addSql("ALTER TABLE report_film CHANGE id_user id_user INT NOT NULL, CHANGE id_film id_film INT NOT NULL");
        $this->addSql("CREATE INDEX id_user ON session (id_user)");
        $this->addSql("ALTER TABLE user ADD email VARCHAR(255) DEFAULT NULL, ADD username VARCHAR(255) DEFAULT NULL, ADD password LONGTEXT DEFAULT NULL, ADD invitation_code VARCHAR(255) DEFAULT NULL, ADD picture_file LONGTEXT DEFAULT $
        $this->addSql("CREATE UNIQUE INDEX email ON user (email)");
        $this->addSql("ALTER TABLE video CHANGE timestamp timestamp DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL");
    }
}

我认为这突出了同样的问题-用户实体没有被正确地扩展。

这就是为什么不建议生产使用
原则:模式:更新的原因。有一种更好、更强大的方法:使用。由于您的数据库中有大量更改(例如,您的某些列只需重命名,某些列是新的,它们需要填充,等等),您应该在自己的数据库中处理这些更改,而不是自动处理。通过条令迁移,您可以以一种健壮的方式完成这一步骤。您可以尝试从diff自动生成migrations类,但最终我认为您必须根据需要修改生成的类。我从一个新的symfony安装中为您创建了一个migrations类,并使用一个裸用户类(仅id)扩展了FOSUserBundle基类


正常,已修复。我有一个注册实体扩展了用户实体,在复制/粘贴之后,我在注册实体上留下了一些“用户”注释,因此它认为存在重复。我现在可以用正常的方式更新数据库了。

谢谢,但是为什么条令:模式:更新不适合?您的脚本不会删除表的内容吗?因为它会自动生成一些sql语句,在像您这样的情况下,这些语句做了错误的事情。迁移很方便,因为您可以控制完成的步骤。我发布的类是一个示例,其中包含FOSUserBundle基类需要的所有列。您必须将该语句改编为
ALTER TABLE
,以修改现有的用户表。因此,无法再从实体自动生成架构了?确实,您阅读了链接文档吗?还有
条令:迁移:diff
命令,它根据实体映射和数据库中模式之间的差异自动生成迁移类(如
条令:模式:更新
)。但它不是自动执行的。您应该检查生成的类,如果出现故障(并非每个自动生成的语句都是完美的),则根据需要对其进行修改,然后调用
原则:迁移:迁移
命令。一个三步的过程。好的,考虑到这一点。不幸的是,它的作用与
--dump sql
相当,即没有输入FOSUserBundle“User”字段,尽管实体扩展了FOSUserBundle“User”实体。我编辑了我的问题以突出问题。
    "doctrine/migrations": "*@alpha",
    "doctrine/doctrine-migrations-bundle": "dev-master"