みなさん、こんにちは。どんぶラッコです。
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
https://laravel.com/docs/7.x/structureapp
directory by default, and allow the developer to place them somewhere else if they choose.
ざっくり翻訳すると、こんなニュアンスです。
わざとModelsディレクトリをなくしています。
というのも、「モデル」って言葉は人によって定義が違う。ある人はビジネスロジックの全てをモデルに含めるべきだと言うし、別の人は、RDB(リレーショナルデータベース)に関係するクラスを「モデル」と定義します。
だから、app配下に直接置いて、好きな場所に移動させられるようにしています。
なので、 app
配下に直接作成されるのは、様々な定義に対応するためであって、 app
ディレクトリ配下に直起きがベストプラクティスというわけではありません!
製作者が思うディレクトリ構造を作り変えられる柔軟性を持つLaravelならではの理由ですね。
ちなみに、kore1server.comさんによると LaravelからModelsディレクトリが削除されたのは Laravel5からだそうです。
フレームワーク側の作者も言及している通り、世の中には設計パターンが無数に存在します。
Laravelではそれぞれの思想に合わせて自由にディレクトリ構造を作り変えられる分、設計者、つまりエンジニア側のリテラシーが求められますね!