前言
最近常看到一些IT帮友提出 MVC 架构的问题,笔者刚好接触过 Laravel、Django、ASP.NET MVC 三种架构,将研读心得整理如下,希望对初学者有些帮助。
Laravel:PHP 的主流架构Django:Python 的主流架构ASP.NET MVC:微软官方架构何谓 MVC
MVC架构主要是提供系统开发者一个物件导向(OOP)、模组化的架构,将程式清楚切割,分离商业逻辑、路由、资料库定义/存取、网页内容,通常是放到不同的档案,大多是以单一类别呈现,这样,后续承接者要为维护就简单多了:
要改商业逻辑就到 Controller 修改要改变网页内容就到 View 修改资料库变更就修改 Model 定义这样是不是很清楚呢?
MVC是 Model、View、Controller 的缩写,也就意谓它是上述三部分组成的,请参考架构图,个别的职责如下:
可以在Model类别中定义函数来操作Model,例如新增、修改、删除、查询,这样,controller 呼叫时会更方便;更进一步,可以定义 View Model,资料来源来自多个资料表,并定义複杂的商业逻辑在其中。
另外,很重要的一点,我们通常会用 Foreign Key 关联资料表,在Model中,会以类别中的属性来串连,这样,我们操作多各表的新增、修改、删除、查询,就会变得非常简单,很多人都会忽略Foreign Key的重要性,在资料库中都省略这方面的定义,致使ORM功能只发挥了一半。
View:就是使用者介面(User Interface),通常是网页内容,包括 HTML、CSS、Javascript,除了静态的内容,我们还会呈现资料库的查询结果,这时我们就要一个机制,来接收 Controller 的资料,每个 MVC 架构都会提供特定的语法来支援这方面的功能:Laravel:BladeDjango:jinja2ASP.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一般概念,希望对初学者有一丝丝的帮助。