FOSUserBundleで作られるuserテーブルのスキーマが思ってたんとちがう場合に確認すること

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のインストールマニュアル](http://symfony.com/doc/current/bundles/FOSUserBundle/index.html)を読んでみると
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)';
```
で正しくできました。

# 結論

つまりちゃんとマニュアルどおりやればハマらなくてすんだんや...