Symfony2 には CRUD 画面を自動生成する機能がありますが、生成したコードをそのままプロジェクトに適用することはほとんどなく、何らかのカスタマイズが必要なことが多いです。Generate 結果を毎回修正するのがしんどいので、カスタマイズする方法を調べてみました。
動作確認環境
- Symfony 2.3
目次
- SensioGeneratorBundle の skeleton ディレクトリをコピーする
- skeleton 以下のファイルを変更して Generate 結果を上書きする
- 他の skeleton も修正する
- 参考サイト
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 のドキュメントを確認しましょう。