Laravel

Laravel に Model ディレクトリがないのは何故?

みなさん、こんにちは。どんぶラッコです。

PHPのフレームワークとしてLaravelがありますが、その構造を説明する切り口として、MVC(モデル・ビュー・コントローラ) という概念が紹介されます。

MVCとは設計手法の一つで、ざっくり言うと

Model … データ取得に関すること
View … 表示に関すること
Controller … ModelとViewをつなぐ処理に関すること

のように、役割毎にコードを記述する場所を分けよう!という考え方のことです。

そしてLaravelでは Model や Controller を作るための便利なコマンドを artisan が提供してくれています。

# Modelを作る
php artisan make:model [単数系 (例: Book, WorkFavorite)]

# Controllerを作る
php artisan make:controller BookController --resource --model=Book

ところでみなさん、一つ疑問がありませんか?

上記のコマンドでControllerを作ると app/Http/Controllers/ 配下にコントローラが作成されます。

Viewも resources/views ディレクトリがあります。

しかし、Modelを作ると、 app ディレクトリ配下に直作成されてしまい、Modelsディレクトリがありません。

自分で Models ディレクトリを作れば対応することができますが、一手間加わってしまって面倒ですよね。

何故 Models ディレクトリを作成しないのでしょうか?

そして、/app ディレクトリに直置きすることがベストプラクティスなんでしょうか?

“移動前提でわざと直に作成してるよ”

この理由については、Laravelの公式ページに記載がありました。

https://laravel.com/docs/7.x/structure

Where Is The Models Directory?

When getting started with Laravel, many developers are confused by the lack of a models directory. However, the lack of such a directory is intentional. We find the word “models” ambiguous since it means many different things to many different people. Some developers refer to an application’s “model” as the totality of all of its business logic, while others refer to “models” as classes that interact with a relational database.

For this reason, we choose to place Eloquent models in the app directory by default, and allow the developer to place them somewhere else if they choose.

https://laravel.com/docs/7.x/structure

ざっくり翻訳すると、こんなニュアンスです。


わざとModelsディレクトリをなくしています。

というのも、「モデル」って言葉は人によって定義が違う。ある人はビジネスロジックの全てをモデルに含めるべきだと言うし、別の人は、RDB(リレーショナルデータベース)に関係するクラスを「モデル」と定義します。

だから、app配下に直接置いて、好きな場所に移動させられるようにしています。


なので、 app 配下に直接作成されるのは、様々な定義に対応するためであって、 appディレクトリ配下に直起きがベストプラクティスというわけではありません!

製作者が思うディレクトリ構造を作り変えられる柔軟性を持つLaravelならではの理由ですね。

ちなみに、kore1server.comさんによると LaravelからModelsディレクトリが削除されたのは Laravel5からだそうです。

フレームワーク側の作者も言及している通り、世の中には設計パターンが無数に存在します。

Laravelではそれぞれの思想に合わせて自由にディレクトリ構造を作り変えられる分、設計者、つまりエンジニア側のリテラシーが求められますね!

ABOUT ME
どんぶラッコ
ECコンサルタント、システムエンジニア経験を経て、ProgLearnのシステム開発を担当。

\面白いと思ったら/

記事のシェア & Twitter のフォロー をお願いします!

@proglearn

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です