iT邦幫忙

7

淺談MVC共通架構 -- Laravel、Django、ASP.NET MVC

mvc

前言

最近常看到一些IT幫友提出 MVC 架構的問題,筆者剛好接觸過 Laravel、Django、ASP.NET MVC 三種架構,將研讀心得整理如下,希望對初學者有些幫助。

  • Laravel:PHP 的主流架構
  • Django:Python 的主流架構
  • ASP.NET MVC:微軟官方架構

何謂 MVC

MVC架構主要是提供系統開發者一個物件導向(OOP)、模組化的架構,將程式清楚切割,分離商業邏輯、路由、資料庫定義/存取、網頁內容,通常是放到不同的檔案,大多是以單一類別呈現,這樣,後續承接者要為維護就簡單多了:

  1. 要改商業邏輯就到 Controller 修改
  2. 要改變網頁內容就到 View 修改
  3. 資料庫變更就修改 Model 定義
    這樣是不是很清楚呢?

MVC是 Model、View、Controller 的縮寫,也就意謂它是上述三部分組成的,請參考架構圖,個別的職責如下:
https://ithelp.ithome.com.tw/upload/images/20180227/20001976w7cvxyECd9.png

  1. Controller 是 MVC 架構的中樞,它負責以下工作:
  • 使用者輸入的URL,透過路由(Routing)的定義,MVC架構會將Request送給一個Controller處理。
  • 透過 Model 存取資料庫,並整理成 View 所需要的內容,通常包括一個類別或類別陣列(Array/List)。
  • 指定要送給瀏覽器的View,同時將 View 所需要的內容,打包送出。
  • View的表單觸發的get/post,透過路由(Routing)的定義,MVC架構會將Request送給一個Controller處理。
  1. Model:通常與資料庫對應,每個資料表對應一個Model類別,操作類別的新增、修改、刪除、查詢,就會直接更動資料庫,這就是所謂的ORM(Object-Relational Mapping),每個 MVC 架構都會提供他們獨有的ORM,例如:
  • Laravel:Eloquent ORM
  • Django:Django ORM
  • ASP.NET MVC:Entity framework

可以在Model類別中定義函數來操作Model,例如新增、修改、刪除、查詢,這樣,controller 呼叫時會更方便;更進一步,可以定義 View Model,資料來源來自多個資料表,並定義複雜的商業邏輯在其中。

另外,很重要的一點,我們通常會用 Foreign Key 關聯資料表,在Model中,會以類別中的屬性來串連,這樣,我們操作多各表的新增、修改、刪除、查詢,就會變得非常簡單,很多人都會忽略Foreign Key的重要性,在資料庫中都省略這方面的定義,致使ORM功能只發揮了一半。

  1. 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 則以選單的方式導引程式設計師。

  1. Laravel:php Artisan ...
  2. Django:python manage.py ...

結語

MVC的架構開發方式已是目前的主流,千萬不要再用直球對決,這裡只簡單介紹MVC一般概念,希望對初學者有一絲絲的幫助。


1 則留言

1
wordsmith
iT邦高手 1 級 ‧ 2018-02-27 10:50:25

清楚明瞭 /images/emoticon/emoticon12.gif

如果只講「觀念」的話,小小建議
1.接 Request 的是 View 而非 Controller
2.Model 就是 Model,不需要「DB」

謝謝建議.

  1. View 是無法接 Request的,必須由 Controller 處理,才能交由View 處理
  2. 是,Model 不一定是對應 DB,可能是其他的 Data Source, 或 in-memory object. 我省略了一些細節。

我要留言

立即登入留言