Symfony2のdoctrine:generate:crudコマンドの出力結果を上書きする

2013年7月9日

symfony-logo

Symfony2 には CRUD 画面を自動生成する機能がありますが、生成したコードをそのままプロジェクトに適用することはほとんどなく、何らかのカスタマイズが必要なことが多いです。Generate 結果を毎回修正するのがしんどいので、カスタマイズする方法を調べてみました。

動作確認環境

  • Symfony 2.3

目次

  1. SensioGeneratorBundle の skeleton ディレクトリをコピーする
  2. skeleton 以下のファイルを変更して Generate 結果を上書きする
  3. 他の skeleton も修正する
  4. 参考サイト

SensioGeneratorBundle の skeleton ディレクトリをコピーする

Generator の出力結果を上書きするには、vendor ディレクトリ以下にある SensioGeneratorBundle の skeleton ディレクトリを自身のバンドルの Resources ディレクトリにコピーします。

まず、Resources ディレクトリに SensioGeneratorBundle ディレクトリを作成します。

$ cd <symfony-project-root>/src/Hoge/PiyoBundle/Resources
$ mkdir SensioGeneratorBundle

次に、vendor ディレクトリ以下にある SensioGeneratorBundle の skeleton ディレクトリを SensioGeneratorBundle 以下にコピーします。

$ cp -rf <symfony-project-root>/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Resources/skeleton ./SensioGeneratorBundle/

skeleton 以下のファイルを変更して Generate 結果を上書きする

Resources/SensioGeneratorBundle/skeleton 以下のファイルを変更すれば、Generator の結果を上書きすることができます。たとえば、index.html.twig の結果を上書きする場合は、skeleton/crud/views/index.html.twig.twig を編集します。

{% block extends %}
{{ "{% extends '::base.html.twig' %}" }}
{% endblock extends %}
{% block body %}
{{ "{% block body -%}" }}
    <h1>{{ entity }} list</h1>
...

編集したら、app/console doctrine:generate:crud コマンドで再度 Generate します。修正内容が反映されていることが確認できます。何度も実行する場合はオプションでデフォルト値を指定すると良いでしょう。

CRUDを Generate する場合

$ php app/console doctrine:generate:crud --entity="AcmeBlogBundle:Post" --with-write --format="annotation" --no-interaction --overwrite

FormType を Generate する場合

$ php app/console generate:doctrine:form AcmeBlogBundle:Post

他の skeleton も修正する

その他の skeleton のを修正することで、Twig テンプレートだけでなく、Controller, FormType, ControllerTest などの出力結果を上書きすることができます。

Twig

SensioGeneratorBundle/skeleton/crud/views/

Controller

SensioGeneratorBundle/skeleton/crud/actions/

FormType

SensioGeneratorBundle/skeleton/form/FormType.php.twig

ControllerTest

SensioGeneratorBundle/skeleton/crud/tests/

skeleton は Twig で書かれていて、比較的カスタマイズがしやすいです。Twig の構文で困った時はTwig のドキュメントを確認しましょう。

参考サイト

-技術ブログ
-