symfonyで既存テーブルからEntityやCRUDを自動生成する。

# 前置き
- 既存のプロジェクトのreplaceだったり、要件的にまずテーブル設計を終わらせてから実装に入る事はよくあると思います。    
その際にテーブル内容から手作業でEntityを作成するのは面倒かつミスの元です。symfonyにはdoctineを利用した既存テーブルからentityを作成する機能があるので活用しましょう。

# 実行環境
- php 7
- symfony(2.7)

# 内容
- テーブルを作成する。
- 作成したテーブルを元にEntityクラスを作成する。
- 作成したEntityクラスを元にCRUDやFormクラスを作成する。

## テーブルを作成する
- 下記のテーブルを作成する。

```MYSQL
CREATE TABLE `to_do` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `task` tinyint(1) NOT NULL,
  `type` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `memo` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `date` date NOT NULL,
  `r_datetime` datetime DEFAULT NULL,
  `u_datetime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
```


## 作成したテーブルを元にEntityクラスを作成する。
- doctrine:mapping:convertを使う
	- コマンド 
		- `doctrine:mapping:convert [--filter FILTER] [-f|--force] [--from-database] [--extend [EXTEND]] [--num-spaces [NUM-SPACES]] [--namespace [NAMESPACE]] [--em [EM]] [--] <to-type> <dest-path>
`
- データベースから作成する場合
	- `--from-database` オプションを利用する。 
	-  `php app/console doctrine:mapping:convert 出力種別 出力ディレクトリ  --from-database` 
	-  例 
		-  `php app/console doctrine:mapping:convert annotation ./src/AppBundle/Entity  --from-database`  
-　複数のDB設定を使い分けている場合
	- `--em`オプションを使う
	- `php app/console doctrine:mapping:convert 出力種別 出力ディレクトリ  --from-database  --em="entity_manager名" `
	- 例 
		- `php app/console doctrine:mapping:convert annotation ./src/AppBundle/Entity  --from-database  --em="sub" `
- namespaceを付与したい場合
	- `--namespace`オプションを使う。
	- escapeが必要なので注意
	- `php app/console doctrine:mapping:convert 出力種別 出力ディレクトリ --from-database  -namespace="namespace名"`
	- 例
		-  `php app/console doctrine:mapping:convert annotation ./src --from-database  -namespace="AppBundle\\Entity\\"`    
- 指定のテーブルのみに実行したい場合
	- `filter`オプションを使う。
	- create tableの時の名前ではなく、table名から生成されるキャメルケースの名前なので注意 例 `to_do` → `ToDo`
	- `php app/console doctrine:mapping:convert 出力種別 出力ディレクトリ --from-database  --filter="テーブル名"`
	- 例
		- `php app/console doctrine:mapping:convert annotation ./src/AppBundle/Entity  --from-database  --filter="ToDo" `  

## 作成したEntityからの自動生成

### 共通項目
- `doctrine:generate`コマンドを利用する。
- 対象指定方法
	- Bundle名での指定 
		- Bundle名のみの指定でそのbundleにある全てのEntityに対して実行される。
		- doctrine:generate:コマンド名 bundle名
	- Entityでの指定
		- Entityへの指定
			- `Bundle名:Entity名`で指定する
		- namespaceの指定 
			- doctrine:generate:コマンド名 `namespace`
- よく使うオプション
	- `--no-backup`
		- entityのbackupファイルを作成しない
  
#### getter setterを追加
-  doctrine:generate:entitiesを使う
-  bundle指定
	- `php app/console doctrine:generate:entities AppBundle`
-  entity指定
	- `php app/console doctrine:generate:entities AppBundle:Todo` 
-  namespace指定
	- `php app/console doctrine:generate:entities AppBundle/Entity/Todo` 

#### formを生成する
- doctrine:generate:formを使う
-  bundle指定
	- `php app/console doctrine:generate:form AppBundle`
-  entity指定
	- `php app/console doctrine:generate:form AppBundle:Todo` 
-  namespace指定
	- `php app/console doctrine:generate:form AppBundle/Entity/Todo` 


#### crudを生成する
- doctrine:generate:crudを使う
- entityからview,form,controllerの雛形を生成する。    
-  bundle指定
	- `php app/console doctrine:generate:crud AppBundle`
-  entity指定
	- `php app/console doctrine:generate:crud AppBundle:Todo` 
-  namespace指定
	- `php app/console doctrine:generate:crud AppBundle/Entity/Todo`

コンソール

```
bundle名:entity名
You must use the shortcut notation like AppBundle:Todo [ENTER]

編集処理が必要か?(noだと新規登録、編集機能が生成されない)
Do you want to generate the "write" actions [no]? yes [ENTER]

Determine the format to use for the generated CRUD.

フォーマットの指定
Configuration format (yml, xml, php, or annotation) [annotation]: [ENTER]
Determine the routes prefix (all the routes will be "mounted" under this
prefix: /prefix/, /prefix/new, ...).

URLプレフィックスの指定
Routes prefix [/todo]: [ENTER]

最後の確認
Do you confirm generation [yes]?  [ENTER]
```


# 参考URL
- http://docs.symfony.gr.jp/symfony2/cookbook/doctrine/reverse_engineering.html
- http://qiita.com/village/items/18da7bd94c37bc4f65a5