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

  • 0
    いいね
  • 0
    コメント

    前置き

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

    実行環境

    • php 7
    • symfony(2.7)

    内容

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

    テーブルを作成する

    • 下記のテーブルを作成する。
    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_doToDo
      • 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