Laravel5、祝!modelsディレクトリー削除!

タグ: Laravel5  

Laravel3、Laravel4から使いはじめた人は、modelsディレクトリーにEloquentモデルのUserクラスが設置しているがため、この「モデル」はEloquent専用だと思います。

しばらくすると(もしくは、最初から知っていたかも知れませんが)、「太った(fat)コントローラーはいけない」という話を聞きます。アプリケーションのロジック自身をコントローラーに書いてはダメだという知識です。

すると、「じゃあ、どこに置いたら良いんだよ。」という話になります。

実際、フォーラムではどこに設置するか、modelsディレクトリーをどう使用するかという話題が繰り返されていました。

Laravel4では、Composerに乗り、当初はPSR-0、後にPSR-4規約によるクラスローディングと、クラス名=>ファイルパスによるマッピングが開発者により指定できるようになったため、「自分の好み」の構造を作成し、「好きな」場所へ置けるようになりました。

Laravel4のリリース後、しばらく開発者のTaylorさんは電子本を書くことに取り掛かっていました。より大きくて、堅牢なアプリケーションの構築について知見を広げるためです。その中で「modelsは削除し、PSRのローディング規約を使用し、自分の好きなように構築しろ」と言っています。

そして、Laravel5です。ついに、自分の言葉通り"models"ディレクトリーをデフォルトの構造から削除しました。

そもそも、Laravel4までのデフォルト構造は、これもTaylorさんの言葉を借りると、「他のフレームワーク経験者が分かりやすいように、合わせただけ」なのです。ところが、それが(得にmodelsディレクトリーですが)混乱を招いてしまいました。

「LaravelはMVCです」と言っても(今では余りこう書く人もいませんが)、これはモデル/ビュー/コントローラーが分かれているという意味でしかありません。しかもPHPは元々ビューのための言語です。モデルの定義は、各自による解釈のため、曖昧です。ですから、元来さほど意味がなかったのです。

Laravel5では、もう"models"ディレクトリーはありません。ですから、「モデルとは?」という質問に対して自分が持っている「答え」を通常は"app"ディレクトリー下に表現します。(もちろん、自分でPSR-4の指定をcomposer.jsonで行えば、どこにでかまいません。)

自分にとってモデルは?「そりゃ、もちろんEloquentモデルだよ。」ならば、"app/Eloquents"ディレクトリーとか、"app/Eloquent/Models"とかが良いですか?もちろん、お好きなものでどうぞ。名前空間を付けるのを忘れずに。

php artisan make:modelによる、Eloquntモデル生成場所が"app"ディレクトリー下に固定されているのは不便ですが、そのうち改善されるでしょう。そうでなければ、せっかくElixirも導入されたことですし、ファイル監視を行い、"app"直下に"*.php"ファイルが生成されたら、意中のディレクトリーへ自動的に移動する手もありますね。(Elixirでできるか試していません。なにせ、私は生成するよりコピペか直接タイプしちゃうか、IDEのテンプレートによる生成に頼る人間で、クラスのコマンド生成は使用することがないからです。)

この機会です。自分にとってLaravelでの開発の「モデル」が何を意味するのか、どんな「モデル」があるのか考えてみるのが良いのかも知れませんよ。