Phoenix Frameworkのscaffoldingは mix phx.gen.html を実行することで一式生成されます。
標準のscaffoldテンプレートを複製してカスタマイズすると、独自のscaffoldingが可能になります。
標準テンプレートとカスタマイズ版のPATH
オリジナルのgeneratorを作成する際に関係するファイルのPATHは以下の通りです。なお、アプリの名称を someapp としていますが、当然プロジェクトごとに異なる名称となります。
-
標準パッケージのファイルは以下のディレクトリにインストールされます
- テンプレートは、deps/phoenix/priv/templates/
- mixタスクは、deps/phoenix/lib/mix/tasks/
-
カスタマイズしたファイルは以下のディレクトリに置きます(標準ファイル一式をコピー)。なお、初期構成では中間ディレクトリが存在していないことがあるため、作成します。
- テンプレートは、priv/templates/
- mixタスクは、lib/someapp/mix/tasks/
タスク名称の変更
phx.gen.htmlのままではタスク名が干渉するため、コピーしたファイルやモジュール名などをプロジェクトに合わせて変更します。
- テンプレートのディレクトリ名は someapp.gen.html
- mixタスクのファイル名は someapp.gen.html.ex
- タスクのモジュール名は Mix.Tasks.Someapp.Gen.Html
- その他、someapp.gen.html.exファイル内の phx という名称を someapp に置換する
ここまでの準備により、 mix someapp.gen.html というコマンドでオリジナルのジェネレータを実行できます。このコマンドは priv/templates/someapp.gen.html/ を参照するため、カスタムテンプレートのファイルが生成されます。
作業過程の具体的なコマンドなどは、 Customise your Phoenix HTML Generator という記事が参考になります。
ContextとSchemaのカスタマイズ
phx.gen.html ではcontextやschemaも生成されます。phx.gen.html をカスタマイズした場合、contextやschemaは標準の phx.gen.context と phx.gen.schema を参照しているため、画面テンプレート以外は標準のコードが生成されます。
ContextやSchemaもカスタマイズするには、追加で以下のカスタマイズも必要になります。
- Mixタスクの someapp.gen.html.ex に記載されている、 alias Mix.Tasks.Phx.Gen を alias Mix.Tasks.Someapp.Gen に変更する
- この行の指定により、ContextとSchemaを参照している
- phx.gen.html と同様に、phx.gen.context と phx.gen.schema のテンプレート、Mixタスクもカスタム版を用意する
- Mixタスクのファイルも編集し、Phxやphxを Someappに差し替える
コントローラーやモデルにも定型カスタムコードを置きたい場合、これにより一式カスタマイズできます。
scaffoldのロールバック
テンプレートをカスタマイズした場合に限った話題ではありませんが、生成したファイルを取り消したい場合があります。
Phoenixのmixタスクはロールバックを提供していないようなので、gitでロールバックするのが確実です。ファイルを生成する前にコミットしておき、やり直したいタイミングで、git checkout, git clean -f などを実行して戻すと確実です。
Chuma Takahiro