Symfony2で何も考えずFOSUserBundleをインストールした場合、生成されるUserテーブルのスキーマが思ってたんと違ってハマったのでメモ
環境
PHP7.0.5
Symfony2.8
PostgreSQL9.5
$ composer require friendsofsymfony/user-bundle
上記でインストールしてEntity/User.php作成して
User.phpを作成しようと以下のコマンドを実行
$ php app/console doctrine:schema:update --dump-sql
CREATE SEQUENCE user_id_seq INCREMENT BY 1 MINVALUE 1 START 1;
CREATE TABLE "user" (id INT NOT NULL, PRIMARY KEY(id));
圧倒的に生成されるカラムが足りない...
原因
composer require時にバージョンを指定しなかったため、1.3.6がインストールされており、
その場合はEntity/User.phpのFOSUserBundleからのuseを以下のようにする必要がある。
<?php
namespace Hoge\FugaBundle\Entity;
//use FOS\UserBundle\Model\User as BaseUser; // ★こうではなく
use FOS\UserBundle\Entity\User as BaseUser; // ★こうする
use Doctrine\ORM\Mapping as ORM;
そして以下のコマンドを実行
$ php app/console doctrine:schema:update --dump-sql
CREATE SEQUENCE user_id_seq INCREMENT BY 1 MINVALUE 1 START 1;
CREATE TABLE "user" (id INT NOT NULL, username VARCHAR(255) NOT NULL, username_canonical VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, email_canonical VARCHAR(255) NOT NULL, enabled BOOLEAN NOT NULL, salt VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL, last_login TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, locked BOOLEAN NOT NULL, expired BOOLEAN NOT NULL, expires_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, confirmation_token VARCHAR(255) DEFAULT NULL, password_requested_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, roles TEXT NOT NULL, credentials_expired BOOLEAN NOT NULL, credentials_expire_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, PRIMARY KEY(id));
CREATE UNIQUE INDEX UNIQ_8D93D64992FC23A8 ON "user" (username_canonical);
CREATE UNIQUE INDEX UNIQ_8D93D649A0D96FBF ON "user" (email_canonical);
COMMENT ON COLUMN "user".roles IS '(DC2Type:array)';
正しくできました。
注意
ちゃんとFOSUserBundleのインストールマニュアルを読んでみると
composer require時には以下のようにバージョンを指定している
$ composer require friendsofsymfony/user-bundle "~2.0@dev"
上記でインストールし、Entity/User.phpをマニュアルどおり
<?php
namespace Hoge\FugaBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser; // ★マニュアルどおり
use Doctrine\ORM\Mapping as ORM;
にしたところ
$ php app/console doctrine:schema:update --dump-sql
CREATE SEQUENCE user_id_seq INCREMENT BY 1 MINVALUE 1 START 1;
CREATE TABLE "user" (id INT NOT NULL, username VARCHAR(255) NOT NULL, username_canonical VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, email_canonical VARCHAR(255) NOT NULL, enabled BOOLEAN NOT NULL, salt VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL, last_login TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, locked BOOLEAN NOT NULL, expired BOOLEAN NOT NULL, expires_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, confirmation_token VARCHAR(255) DEFAULT NULL, password_requested_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, roles TEXT NOT NULL, credentials_expired BOOLEAN NOT NULL, credentials_expire_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, PRIMARY KEY(id));
CREATE UNIQUE INDEX UNIQ_8D93D64992FC23A8 ON "user" (username_canonical);
CREATE UNIQUE INDEX UNIQ_8D93D649A0D96FBF ON "user" (email_canonical);
COMMENT ON COLUMN "user".roles IS '(DC2Type:array)';
で正しくできました。
結論
つまりちゃんとマニュアルどおりやればハマらなくてすんだんや...