Phoenixのscaffoldカスタマイズ

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 などを実行して戻すと確実です。