Laravel、Django、ASP.NET MVC 三種MVC架構研讀心得。
前言
最近接觸過 Laravel、Django、ASP.NET MVC 三種MVC架構,將研讀心得整理如下,希望對初學者有些幫助。
- Laravel:PHP 的主流架構
- Django:Python 的主流架構
- ASP.NET MVC:微軟官方架構
何謂 MVC
MVC架構主要是提供系統開發者一個物件導向(OOP)、模組化的架構,將程式清楚切割,分離商業邏輯、路由、資料庫定義/存取、網頁內容,通常是放到不同的檔案,大多是以單一類別呈現,這樣,後續承接者要為維護就簡單多了:
- 要改商業邏輯就到 Controller 修改
- 要改變網頁內容就到 View 修改
- 資料庫變更就修改 Model 定義
這樣是不是很清楚呢?
MVC是 Model、View、Controller 的縮寫,也就意謂它是上述三部分組成的,請參考架構圖,個別的職責如下:
- Controller 是 MVC 架構的中樞,它負責以下工作:
- 使用者輸入的URL,透過路由(Routing)的定義,MVC架構會將Request送給一個Controller處理。
- 透過 Model 存取資料庫,並整理成 View 所需要的內容,通常包括一個類別或類別陣列(Array/List)。
- 指定要送給瀏覽器的View,同時將 View 所需要的內容,打包送出。
- View的表單觸發的get/post,透過路由(Routing)的定義,MVC架構會將Request送給一個Controller處理。
- Model:通常與資料庫對應,每個資料表對應一個Model類別,操作類別的新增、修改、刪除、查詢,就會直接更動資料庫,這就是所謂的ORM(Object-Relational Mapping),每個 MVC 架構都會提供他們獨有的ORM,例如:
- Laravel:Eloquent ORM
- Django:Django ORM
- ASP.NET MVC:Entity framework
也可以在Model類別中定義函數來操作Model,例如新增、修改、刪除、查詢,這樣,controller 呼叫時會更方便。
另外,很重要的一點,我們通常會用 Foreign Key 關聯資料表,在Model中,會以類別中的屬性來串連,這樣,我們操作多各表的新增、修改、刪除、查詢,就會變得非常簡單,很多人都會忽略Foreign Key的重要性,在資料庫中都省略這方面的定義,致使ORM功能只發揮了一半。
- View:就是使用者介面(User Interface),通常是網頁內容,包括 HTML、CSS、Javascript,除了靜態的內容,我們還會呈現資料庫的查詢結果,這時我們就要一個機制,來接收 Controller 的資料,每個 MVC 架構都會提供特定的語法來支援這方面的功能:
- Laravel:Blade
- Django:jinja2
- ASP.NET MVC:Razor
特定的語法會包括樣板(Template)、簡單的邏輯判斷,嵌入在網頁內,例如Laravel/Django:
<html>
<body>
<h1>Hello, {{ $name }}</h1>
</body>
</html>
{{ $name }} 就代表 Controller 傳來的 $name 變數值。
ASP.NET MVC 則以 Model.name 表示。
另外,View 通常會提供 for 迴圈來呈現陣列的內容,例如 ASP.NET MVC:
<ul>
@foreach (var item in Model.Foos)
{
<li>@item.Bar</li>
}
</ul>
另外,View 也會提供頁面繼承或母版網頁的功能,以方便每個網頁共用選單及標題,不須每一頁都重覆定義選單及標題。
MVC架構支援的工具
如果要程式設計師每一個頁面都要從頭分別撰寫View及Controller,每一個資料表都要同時在資料庫定義一遍,並在程式中定義一個類別,那反彈一定很大,所以每個MVC架構都會提供工具自動產生框架(Scaffold),即標準的格式,你只要其中填入實質的內容即可,這樣不僅省事,也減少打字錯誤(Typo),Laravel、Django提供指令式的介面(Command Line Interface, CLI),ASP.NET MVC 則以選單的方式導引程式設計師。
- Laravel:php Artisan ...
- Django:python manage.py ...
結語
MVC的架構開發方式已是目前的主流,千萬不要再用直球對決,這裡只簡單介紹MVC一般概念,希望對初學者有一絲絲的幫助。