1. 快速入门:从零基础到完整的控制器与视图
1.1 核心概念回顾
在本节,我们快速回顾MVC架构中的关键角色:控制器负责接收请求并执行业务逻辑,视图负责展示数据,模型负责数据访问。通过理解这些角色,可以避免把逻辑混在视图里。
本教程强调数据传递的通道:控制器把数据打包成数组,传给视图模板;视图再把变量渲染到页面上。此处的分离关注点是保持代码可维护性的核心。
1.2 最小化项目结构
要实现零基础友好,我们采用一个简化的目录结构:入口脚本index.php、控制器放在 app/controllers、视图放在 app/views。这样可以直观地理解请求的走向。
.
├─ index.php
├─ app/
│ ├─ controllers/
│ │ └─ HomeController.php
│ ├─ views/
│ │ └─ home/index.php
│ └─ core/
│ └─ ViewRenderer.php
借助这样的结构,路由入口将请求映射到具体的控制器方法,从而实现简单而清晰的请求流程。
2. 路由入口与请求分发
2.1 入口脚本 index.php 的作用
入口脚本作为应用的起点,负责解析请求中的控制器和动作,并把执行权交给对应的对象。统一入口有助于后续的扩展与维护。
通过读取查询参数(如 controller 与 action),我们可以实现一个 简单的路由机制,而无需复杂的路由库。
2.2 最小化路由实现
下面给出一个极简的路由实现示例,展示如何从 URL 获取控制器和动作,并安全地调用对应的方法。请注意,这只是教学用的简化版本,正式项目需要更严格的参数校验与错误处理。
$action();
?>2.3 控制器实例化与调用
在控制器中,我们将业务逻辑与 视图渲染解耦。控制器要负责准备数据并选择需要渲染的视图。
通过将数据作为关联数组传递给视图,可以实现数据传递的整洁方式,使得视图层保持纯粹的渲染职责。
3. 控制器的创建与应用
3.1 控制器的职责与设计要点
一个良好的控制器应具备清晰的职责边界:接收请求、调用模型、准备数据、选择 视图。尽量避免在控制器中写死 HTML,保持业务逻辑与呈现分离。
在本教程的场景中,HomeController是一个示例控制器,负责处理首页的请求并把数据传递给视图。通过这样的分工,后续扩展变得更加方便。
3.2 第一个控制器示例
下面给出一个最小化的控制器示例,它实现一个 index 动作,准备数据并调用视图进行渲染。
'首页','message' => '欢迎来到简化的 PHP MVC 示例'];ViewRenderer::render('home/index', $data);}
}
?>
通过这个示例,我们看到数据传递过程的核心:键值对被传递给视图,以便在模板中使用。
3.3 数据传递与视图开启
数据传递完成后,视图模板就可以使用这些变量来渲染页面。下面展示如何在控制器中将数据绑定到视图,以及在视图中显示数据。
'首页','message' => '这是一个通过控制器传递给视图的数据示例'
]);
?>
在上面的调用中,我们把 title 和 message 两个键的值传给视图,视图将使用 变量绑定 来呈现最终页面。
4. 视图的创建与渲染全流程
4.1 视图文件的基本结构
视图文件通常包含 HTML 结构和少量的内嵌 PHP,用于输出变量。请记住,视图应只负责渲染,不要放置复杂的业务逻辑。
通过将数据从控制器传递到视图,我们实现了一个清晰的渲染管道,使得页面模板更易于测试和维护。

4.2 简单模板:home/index.php
下面是一个简单的视图模板示例,展示如何显示传递过来的变量。title 会作为页面标题呈现,message 显示欢迎语。
在此模板中,使用 htmlspecialchars 进行输出防止 XSS,确保输出安全。模板尽量保持简单,以便快速上手。
4.3 视图渲染器的实现
为了让控制器与视图解耦,我们引入一个轻量的 视图渲染器,负责加载对应的模板并注入数据。
通过 extract,传递的键名会成为局部变量,便于在 视图模板 中直接使用。


