お互いのフレームワークで簡単なToDoアプリを作成し、双方の構造を比較する。
MVCとMTV
前提として、LaravelはMVC構造を持っている。
MはModel、VはView、CはControllerである。
それに対し、DjangoはMTV構造を持っている。
MはModel、TはTemplate、VはViewを表す。
これを踏まえ、まずはTemplateやControllerなどのファイル達がツリーのどこにあるのかを確認する。
構成
Django↓
todo_project/
├── manage.py
├── venv/
├── db.sqlite3
│
├── todo/
│ ├── admin.py
│ ├── apps.py
│ ├── forms.py
│ ├── migrations/ ← 【Migration】
│ ├── models.py ←【Model】DBテーブルの定義
│ ├── templates/todo/
│ │ └── task_list.html ←【Template】HTMLのビュー部分
│ ├── tests.py
│ └── views.py ←【View】処理・ロジック・データ取得
│
└── todo_project/
├── __init__.py
├── asgi.py
├── settings.py
├── urls.py ←【ルーティング】URLからViewの橋渡し
└── wsgi.py
Laravel↓
laravel_project/
├── artisan
├── vendor/
├── .env
│
├── app/
│ ├── Models/
│ │ └── Task.php ←【Model】DBテーブルの定義
│ └── Http/
│ └── Controllers/
│ └── TaskController.php ←【Controller】処理・ロジック・データ取得
│
├── resources/
│ └── views/
│ └── todo/
│ └── index.blade.php ←【View】HTMLのビュー部分
│
├── routes/
│ └── web.php ←【ルーティング】URLからViewの橋渡し
│
├── database/
│ ├── migrations/
│ │ └── 2025_xx_xx_create_tasks_table.php ←【Migration】
│ └── database.sqlite
│
└── config/
└── app.php
ツリーを比較した特徴・共通点
呼び方が違うだけで実際の役割としては1対1で対応している。
以下にまとめ
- MVCとMTV
- DBなど、主にデータを扱う箇所(Mの部分)
- Django → models.py
- Laravel → Models
- HTMLを表示する箇所(V、またはTの部分)
- Django → templates
- Laravel → views
- 実際の処理フローなどのロジックを記述する箇所(C、またはVの部分)
- Django → views.py
- Laravel → Controllers
- DBなど、主にデータを扱う箇所(Mの部分)
- その他
- ルーティング
- Django → urls.py
- Laravel → web.php
- ORM
- Django → Django ORM
- Laravel → Eloquent ORM
- つまり、双方とも直にSQLを書かずにDB操作が可能ということ
- コマンドライン
- Django → manage.py
- Laravel → artisan
- お互いにmigrationを持つ
- ルーティング
私は主にLaravelを使用していたため、ControllerポジションのディレクトリがDjangoでView呼びされているところに中々慣れない。
しかし、基本的なWebアプリ構成は同じである。
相違点
既出だがMVCとMTV呼び方の違いが挙げられる。
また、設計思想の点で双方にこのような違いがある。
- Laravel → 「1つの大きなアプリに機能を追加していく」
- Django → 「複数のアプリを組み合わせて構成する」
比較するために改めてツリーを作成した。
Django↓
todo_project/
├── todo/ ← ToDo管理アプリ
│ ├── models.py
│ ├── views.py
│ ├── urls.py
│ ├── templates/
│ └── ...
├── user/ ← ユーザー管理アプリ
│ ├── models.py
│ ├── views.py
│ ├── urls.py
│ └── ...
└── todo_project/
├── settings.py
└── urls.py ← 各appのurlsを統合(小規模ならここにまとめてもよいが、基本はappごとに分割管理)
- 一つの機能 = 1アプリという構造
- 各アプリは独立しており、Model・View・Templateをそれぞれ自前で持っている。
独立した複数のアプリ達を統合して、一つの完成品とするのがDjangoのやり方である。
Laravel↓
laravel_project/
├── app/
│ ├── Models/
│ ├── Http/
│ │ ├── Controllers/
│ │ └── Middleware/
│ ├── Services/
│ └── ...
├── resources/views/
├── routes/web.php
└── database/migrations/
- 機能全体が一つのアプリケーション
- 機能を拡張、追加する場合、新しくControllerやModelを追加する
大きな箱に必要なものを詰めて完成品とするのがLaravelのやり方である。
まとめ
DjangoでToDoアプリを作成中、プロジェクトの中にプロジェクトを入れているようで物凄く違和感があった。
今回このように整理できたので、少しばかりモヤモヤが晴れた気がする。
今後に向けてのインプットとして活かしていきたい。