"MyApp"というアプリケーションを作りたい場合、Catalystのドキュメントにもそう書いてあるから皆ついついこう始める:
catalyst.pl MyApp
libディレクトリ内で作成されるモジュール類はこんな感じ:
lib/MyApp.pm
lib/MyApp/Controller/Root.pm
lib/MyApp/Model
lib/MyApp/View
でもいくらWebアプリといってもバッチが走ったり、他のシステムとWeb以外のところで結合したりしてほぼ100% Webだけでは完結しない。そういう時にlib/MyApp直下にWeb用のモジュールを入れてしまうと段々おかしくなってきます。
例えばWebから入ってきたなんらかしらのデータをvalidateするコードを入れたいとして、lib/MyApp/Validate.pmに入れるとこれはWeb用なのかそれ以外用なのかがわからない。かといって例えばDBIx::Class経由でデータベースを使うプロジェクトの場合、Webコンポーネント以外のスクリプト等も当然のごとく同じデータベースコードを使うのでそういうのは共通の場所に置いておきたい。
こういう事を踏まえて、Catalystのコンポーネントは最初からMyApp::Webに格納するのが後々便利。
catalyst.pl MyApp::Web
こうするとMyApp::Webの名前空間以下にCatalystコンポーネントが作られる
lib/MyApp/Web.pm
lib/MyApp/Web/Controller/Root.pm
lib/MyApp/Web/Model
lib/MyApp/Web/View
これで共通コンポーネントであるBIx::Classスキーマを足す場合は
lib/MyApp/Schema.pm
に置けるし、先ほどのWeb専用のValidate.pmを置くのであれば
lib/MyApp/Web/Validate.pm
とできる。さらに、CLIインターフェースがあるようなアプリの場合は
lib/MyApp/CLI/Validate.pm
ともできるので便利便利。
# と、偉そうに書いているが、某プロジェクトでは今朝ようやくこう変えた。