掌握了这个关键概念,开发 Web 应用程序就变得容易多了! 掌握了这个关键概念,开发 Web 应用程序就变得容易多了!

掌握了这个关键概念,开发 Web 应用程序就变得容易多了!

MVC RCV

模型-视图-控制器(MVC)是Web应用程序开发中非常流行的模式。几乎所有知名的应用程序框架都在使用它,包括Laravel、Ruby on Rails、CakePHP、CodeIgniter、Laminas(以前称为Zend)、Yii、Spring、Grails……等等,不胜枚举。

如果你是 Web 应用设计新手,你可能拿起一本书,费力地读完了关于 MVC 范式/架构的学术性章节。这些章节通常充斥着晦涩难懂的泛泛之谈,而不是做一些显而易见的事情,比如追踪应用程序的请求流程。

所以我们先从最显而易见的说起。首先,我们先排除模型(Models)。倒不是说模型不好——实际上,你应该使用它们。但应用程序架构并不真正依赖于它们。而它真正需要的,甚至连首字母都不需要大写:路由(Routes)。所以我们来看看RCV (路由-控制器-视图),因为这才是这些应用程序实际运作的方式。

在这个例子中,我们将使用 Laravel,它是一个 PHP 框架,但这些概念对于其他框架/语言也是相同的。

我们先从请求开始。这通常是指用户的网络浏览器(但也可能是调用 API 的脚本)。假设有人在 example.com 上购物。他们首先访问 www.example.com。

用户的浏览器会访问 https://www.example.com,这个请求首先由您服务器上的 Web 服务器(例如 Nginx 或 Apache)处理。Web 服务器配置为将所有请求指向 index.php 文件,该文件会加载框架的其余部分。

框架首先会将请求传递给路由器(即 RCV 中的 R)。在 Laravel 中,路由器由您创建的 routes/web.php 文件控制。路由器包含如下规则:

  • “如果请求是针对 www.example.com 的 GET 请求,则将请求传递给 IndexController”
  • “如果请求是针对 www.example.com/inventory/<编号> 的 GET 请求,则将该请求连同该库存编号一起传递给 StoreController。”
  • “如果请求是针对 www.example.com/search 的 POST 请求,则将请求传递给 SearchController”

那么,什么是控制器(RCV 中的 C)呢?它是所有应用程序逻辑的所在之处。如果你的应用程序需要进行一些处理来准备返回的页面,所有这些工作都在控制器中完成。

所以,在这些例子中:

  • 对 www.example.com 的 GET 请求可能只是一个静态页面,也可能是从数据库中获取一些数据,例如库存信息、当前特价商品、最新博客文章等。
  • 为了处理对 www.example.com/inventory/<number> 的 GET 请求,StoreController 将前往数据库获取有关该库存编号的信息。
  • 为了处理向 www.example.com/search 发送的 POST 请求(用户输入搜索词并按回车键),SearchController 将查询数据库以获取结果。

每个控制器都是一个独立的 PHP 类,需要您自行创建。这里我们做了简化——通常情况下,每个控制器会针对每种类型的请求设置不同的函数,并将这些函数分组以便于代码复用,但这只是一个示例。

假设有人请求查询库存商品 1234 的信息。R交换机将请求发送给仓库控制器,仓库控制器查询数据库并获取该库存商品的全部信息。下一步是将这些信息转换成美观的 HTML 格式,并发送回给用户。

这时视图就派上用场了。视图就像一个框架,包含了所有的 CSS、JavaScript、HTML 标签等等,以及数据占位符。因此,它会包含页眉、页脚和内容部分。控制器通过填充所有数据来“润色”视图,然后将页面发送给用户。至此,我们的 RVC 往返就完成了。

并非每个请求都需要所有这些步骤。例如,对于静态内容,路由器可以直接发送静态页面。或者,控制器可能不需要访问数据库。但通常情况下,请求会遵循路由器-控制器-视图的路径。

那么模型呢?

这些女神依然可以为您的网络应用程序增添光彩。

模型是一个对象,它代表数据库中的一行/一条记录(例如在 MySQL 或 PostgreSQL 等 SQL 数据库中)或一个文档(例如在 MongoDB 等 NoSQL 数据库中)。您无需直接编写 SQL,而是可以执行以下操作:

 $item = Inventory::find(1234);
$item->discount = .15;
$item->save();

…而不是写成“UPDATE inventory SET discount = .15 WHERE id = 1234”。

您可能认出这就是对象关系映射(ORM)。

它们确实很有帮助,但如果你愿意,也可以编写一个 Web 应用程序,然后在控制器中直接编写 SQL 目录。模型的作用仅仅是方便控制器更轻松地操作数据库。

此外,还有其他一些组件。大多数 Web 框架都包含某种模板引擎,以便轻松创建视图(例如,Laravel 使用 Blade 模板引擎)。框架通常还包含一些实用组件,例如会话管理、身份验证/授权系统、日志记录和调试工具等等。

凭借基本的路由->视图->控制器请求流程模式,即使你是Web开发新手,选择任何MVC应用程序框架都应该是合理的。正如Laravel routes.php文件中所说:“创造伟大的事物!”