手把手编写PHP框架 深入了解MVC运行流程
【手把手教你编写PHP框架,深入理解MVC运行流程】
一、揭开MVC的神秘面纱
MVC模式,即模型(Model)-视图(View)-控制器(Controller)模式,是软件工程中一种重要的软件架构模式。在PHP中,MVC模式也被广泛应用,特别是在Web开发中,我们称之为Web MVC。自上世纪70年代起,MVC模式逐渐发展成熟,其主要目的是实现动态程序设计,简化程序修改和扩展,提高代码复用性,以及对复杂度的有效管理。
二、MVC各部分的职责
1. 模型(Model):负责处理大部分业务逻辑和数据库操作。它是连接和操作数据库的抽象层,提供了数据的增删改查等功能。
2. 控制器(Controller):负责响应用户请求,处理用户交互,准备数据并决定如何展示数据。简单来说,控制器充当了“调度员”的角色,协调模型和视图之间的交互。
3. 视图(View):负责数据的呈现。它将数据以HTML或其他格式展示给用户。
三、Web MVC的工作流程
一个典型的Web MVC流程可以简述为以下四个步骤:
1. 控制器截获用户发出的请求。
2. 控制器调用模型完成数据的读取或写入操作。
3. 控制器将处理后的数据传递给视图。
4. 视图渲染结果并呈现给用户。
四、为何要自己开发MVC框架?
现在网络上已经有很多优秀的MVC框架,那么我们为何还要自己开发呢?这不仅仅是一个学习PHP和面向对象编程的机会,更是一个深入理解MVC设计模式的契机。通过自己开发,你可以完全掌控你的框架,将你的想法融入其中,按照你的需求去开发功能和模块。虽然可能不是最完美的,但这是你自己的框架,你的方式。
五、开始开发自己的MVC框架
1. 目录准备:建立项目并设置目录结构。假设我们的项目名为“Todo”,框架名为“FastPHP”。目录包括application(应用代码)、config(配置)、fastphp(框架核心)、public(静态文件)、runtime(临时数据)和scripts(命令行工具)。
2. 代码规范:设定代码规范以确保程序的可读性和可维护性。例如,MySQL表名需小写;模块名首字母大写,并添加“Model”;控制器名首字母大写,添加“Controller”;视图部署结构为“控制器名/行为名”。
接下来,我们将按照这些准备和规范,开始真正的PHP MVC编程之旅。在这个过程中,你将收获无数宝贵的经验和知识,为自己的PHP开发之路打下坚实的基础。
3.3 重定向魔法
为了让所有数据请求都流向一个单一入口,我们在`todo`目录下创建了一个神秘的`.htaess`文件。这个文件的内容仿佛隐藏着网站的秘密,让我们一起来揭晓:
```apache
RewriteEngine On
确保请求的路径不是实际存在的文件或目录
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
所有请求都会被神奇地重定向到 index.php?url=PATHNAME
RewriteRule ^(.)$ index.php?url=$1 [PT,L]
```
为何这么做呢?原因有三:一是程序拥有一个单一的入口点,二是除了静态内容外,所有请求都会流向`index.php`。三是这有助于生成对搜索引擎友好的URL,虽然URL路由尚未介绍,但它的潜力已经悄然显现。
3.4 入口大门
完成上述操作后,我们在`public`目录下开启了新纪元,创建了`index.php`文件。这个文件是网站的门户,内容如下:
```php
// 定义应用目录为当前目录
define('APP_PATH', __DIR__.'/');
// 开启调试模式,便于开发过程中的调试
define('APP_DEBUG', true);
// 设置网站根URL
define('APP_URL', '
// 加载我们的快速开发框架
require './fastphp/FastPHP.php';
```
在PHP的世界中,我们决定舍弃传统的结束符号“?>”。这样做是为了安全起见。当文件中只有PHP代码时,结束标志是不必要的。移除它可以防止在文件末尾意外注入内容,为程序安全加码。
3.5 配置大师与核心请求
在`index.php`中,我们向神秘的`FastPHP.php`发出了请求。那么,这个启动文件中究竟藏着哪些玄机呢?让我们揭开它的神秘面纱:
```php
// 初始化一系列常量,确保程序正常运行
defined('FRAME_PATH') or define('FRAME_PATH', __DIR__.'/');
defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']).'/');
// ... 其他常量的定义 ...
// 包含配置文件,设置数据库连接等关键信息
require APP_PATH . 'config/config.php';
// 引入核心框架类,程序的灵魂所在
require FRAME_PATH . 'Core.php';
// 实例化核心类,启动程序运行
$fast = new Core;
$fast->run();
```
FastPHP核心框架之旅:主请求方法callHook()介绍
在FastPHP核心框架中,有一个关键类——Core,它承载着整个框架的运行逻辑。今天,我们重点其中的主请求方法callHook(),该方法在URL处理方面扮演着核心角色。
想象一下,当你在浏览网页时,输入的URL如何被框架并响应相应的操作?这一切的奥秘,就隐藏在callHook()方法中。
让我们深入了解callHook()的工作原理。该方法的主要任务是获取URL并将其分割成几个关键部分。当你访问一个页面时,比如`yoursite./controllerName/actionName/queryString`,这个URL会被callHook()方法捕获并处理。
它从全局变量`$_GET['url']`中提取URL,并将其分割成三部分:控制器名(controller)、动作名(action)和查询字符串(queryString)。这个过程就像是一场精妙绝伦的魔术表演,将复杂的URL解构为可识别的组件。
接下来,让我们逐一了解这些组件的作用。控制器名指定了哪个控制器应该处理请求,动作名确定了控制器应该执行的具体操作,而查询字符串则包含了传递给这些操作的参数。这些参数可以是任何信息,比如搜索查询、表单数据等。
一旦这些组件被识别和,callHook()方法就开始执行下一步操作。它会实例化相应的控制器,并检查所请求的动作是否存在。如果动作存在,它就会调用该动作并传递查询字符串作为参数。这就像是在指挥一场交响乐团,每个组件都在精准地执行其任务。
如果控制器或动作不存在,callHook()会返回一个错误消息,通知开发者相应的控制器不存在。这是一种对开发者友好的错误处理方式,有助于及时发现问题并进行修复。
在Web开发中,URL链接如todo./item/view/1/first-item都有其独特的组成部分。在fastphp框架中,我们可以从URL中提取出关键信息,如控制器名(controller)、动作(action)以及查询字符串(Query String)。这些信息对于程序的运行至关重要。
控制器作为程序的调度中心,负责接收用户的请求并处理。在fastphp框架中,当接收到一个URL请求时,会首先进行分割处理,识别出控制器和动作。接着,会实例化一个新的控制器对象,其名称为$controller.'Controller',然后调用其相应的方法,即$action。这一过程确保了程序能够准确响应用户的请求。
为了构建程序的基础架构,我们需要创建一个基类,包括控制器、模型和视图。在fastphp框架中,我们新建了一个名为Controller.class.php的控制器基类。这个基类的主要功能是作为总调度中心,负责协调各个部分的工作。
控制器类Controller定义了一些重要的属性和方法。其中,_controller、_action和_view是保护属性,用于存储控制器、动作和视图的相关信息。构造函数__construct用于初始化这些属性,并实例化对应的模型。assign方法用于分配变量,可以在视图中使用这些变量来展示信息。而在析构函数__destruct中,我们调用视图的render方法来渲染并显示视图文件。
这个控制器类不仅实现了控制器自身的功能,还负责与模型和视图的通信。通过实例化这个控制器类,我们可以轻松地处理用户的请求,分配数据并渲染视图,从而为用户提供友好的交互体验。这种设计使得fastphp框架在开发过程中更加灵活和高效。模型基类与数据库处理:构建框架的核心
我们设想一个名为 Model.class.php 的模型基类,它是所有模型类的基础。在这个模型中,我们引入了数据库操作的核心功能,使得模型能够轻松处理数据库交互。为了更好地组织代码,我们创建了一个 Sql.class.php 数据库基类,作为模型基类的核心部分。
一、Model.class.php 模型基类概览
在 Model.class.php 中,我们首先定义了一个 Model 类,它继承了 Sql 类。这个类的主要职责是连接数据库、获取模型名称和表名,并处理基本的数据库操作。以下是 Model 类的基本结构:
```php
class Model extends Sql {
protected $_model;
protected $_table;
public function __construct() {
// 连接数据库
$this->connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
// 获取模型名称和表名
$this->_model = get_class($this);
$this->_model = rtrim($this->_model, 'Model');
$this->_table = strtolower($this->_model);
}
}
```
二、Sql.class.php 数据库基类详解
`connect()` 方法用于建立数据库连接。它使用 PDO(PHP 数据对象)来连接 MySQL 数据库。如果连接失败,它会抛出一个错误并退出程序。
`selectAll()` 方法用于查询数据库中的所有记录。它使用 SQL 查询语句 "select from table_name" 来获取所有记录。
`select($id)` 方法用于根据 ID 查询记录。它使用 SQL 查询语句 "select from table_name where id = value" 来获取特定记录。
`delete($id)` 方法用于根据 ID 删除记录。它使用 SQL 删除语句 "delete from table_name where id = value" 来删除特定记录。
我们引入了视图层(View),这是MVC(Model-View-Controller)架构的重要组成部分之一。在MVC架构中,视图主要负责呈现数据给用户。而我们的视图类View,作为这一层的关键实现,拥有处理和组合数据以生成用户界面的能力。
通过抽象层,我们为数据库操作创建了一个统一的接口。这意味着无论我们使用哪种数据库(如MySQL、PostgreSQL等),都可以通过同一套代码进行操作。这种抽象使得我们的框架具有更高的灵活性和可移植性。而PDO接口,作为一种持久性数据对象接口,已经为我们提供了一个简洁、方便的数据库操作方式。在此基础上,我们的抽象层更进一步简化了数据库编程工作。
具体到我们的视图类View.class.php,它有几个关键的功能:
1. 存储变量:通过assign方法,我们可以将数据和视图关联起来。这样,视图就能够根据这些数据来生成用户界面。
2. 渲染显示:通过render方法,视图类可以包含并展示页面内容。它可以根据不同的控制器和动作加载不同的页面头部、内容和尾部。这使得我们的代码更加模块化,更易于管理和维护。
有了这样的框架,我们就可以通过编写应用来测试框架的功能了。我们需要部署数据库。在SQL中创建一个名为todo的数据库,并在这个数据库中创建一个item数据表。然后,我们需要在models目录中创建一个ItemModel.php模型。这个模型将负责与数据库进行交互,处理与item表相关的业务逻辑。由于目前模型内容为空,我们可以根据需要逐步添加业务逻辑。
继承之力,赋予ItemController全新的能力
随着技术的不断发展,我们面临着新的挑战和机遇。在我们的应用程序中,Item模型继承了Model的强大能力,因此它自然而然地拥有了Model的所有功能。这样的继承关系使得我们的开发过程更加高效和便捷。接下来,让我们如何部署控制器。
在controllers目录下创建一个名为ItemController.php的控制器文件。在这个文件中,我们定义了一个名为ItemController的类,它继承了Controller类。这个类为我们提供了许多方便的方法来处理与Item相关的操作。下面是这个控制器的主要方法及其功能:
首页展示:index()方法用于展示所有条目。它通过调用ItemModel的selectAll()方法来获取所有条目数据,并将这些数据赋值给视图中的相应变量。
添加记录:add()方法用于创建新的条目记录。它通过获取POST请求中的数据并将其添加到数据库中。成功后,它会将相应的信息赋值给视图中的变量。
查看记录:view($id = null)方法用于查看指定条目的详细信息。它通过调用ItemModel的select()方法来获取指定条目的数据并将其赋值给视图中的相应变量。
更新记录:update()方法用于更新数据库中的条目记录。它通过获取POST请求中的数据并调用ItemModel的update()方法来进行更新操作。成功后,它将更新的信息赋值给视图中的变量。
删除记录:delete($id = null)方法用于删除数据库中的指定条目记录。它通过调用ItemModel的delete()方法来删除指定条目的数据。成功后,它将删除操作的结果赋值给视图中的变量。
header.php的内容:
.item {
width: px; / 为项目元素定义宽度 /
}
input {
color: 222222; / 输入字段的文本颜色 /
font-family: geia, times; / 字体 /
font-size: 24px; / 字体大小 /
line-height: 1.2em; / 行高 /
}
a {
color: blue; / 链接的颜色 /
font-family: geia, times; / 字体 /
font-size: 20px; / 字体大小 /
text-decoration: none; / 无下划线或线条装饰 /
}
a:hover { / 鼠标悬停时的链接样式 /
text-decoration: underline; / 显示下划线 /
}
h1 { / 一级标题样式 /
color: 000000; / 颜色为黑色 /
font-size: 41px; / 字体大小 /
letter-spacing: -2px; / 字间距调整 /
line-height: 1em; / 行高 /
font-family: helvetica, arial, sans-serif; / 字体家族 /
border-bottom: 1px dotted ; / 底边框样式 /
}
h2 { / 二级标题样式 /
color: 000000; / 颜色为黑色 /
font-size: 34px; / 字体大小调整 /
letter-spacing: -2px; / 字间距微调 /
}
===============================
欢迎来到我们的数据库世界,这里我们将一起item表与PHP的交融之美。通过下面的代码,我们将一览如何通过PHP来操作数据库中的item表。
一、浏览数据库内的item表的所有记录
-
我们打开index.php页面,这里列出了数据库中所有item表的记录。点击每一项可以查看详情或者进行修改,点击删除则能删除某条记录。添加新的记录也只需要点击添加按钮即可跳转到相应的页面进行操作。
二、添加记录
在add.php页面,我们可以添加新的记录到数据库中。成功添加后,我们会看到相应的提示信息,并可以返回查看添加的条目。每一步操作都会通过PHP语言实现与数据库的交互。
三、查看单条记录与更改记录
在view.php页面,我们可以查看单条记录的详细信息。如果需要修改这条记录,可以直接进入update.php页面进行操作。修改成功后,会有相应的提示信息。这些操作都离不开PHP与数据库的交互。
四、删除记录
在delete.php页面,我们可以删除数据库中的记录。删除成功后会有相应的提示信息。每一个操作都与数据库有着密切的交互,PHP语言在这一过程中起着至关重要的作用。
五、应用测试与源码分享
--
只需在浏览器中访问 todo 程序,就能立刻看到这些功能的实际效果。为了方便大家交流和学习,我们已经将关键代码发布到GitHub上,并添加了必要的注释。仓库地址供大家参考,欢迎克隆和提交你的建议。如果你想了解如何设计更规范的MVC结构或者使用更加规范的操作方式,我们也有相关资源推荐。
-
以上就是本文的全部内容,希望这些代码和解释能对大家的学习有所帮助。无论你是初学者还是资深开发者,我们都希望你能从这篇文章中获得一些启示和灵感。也希望大家能多多支持我们的狼蚁SEO。让我们一起编程的世界,共同学习进步!
提醒一句:代码中的 `cambrian.render('body')` 这句可能是特定项目或框架的代码片段,如果你在使用中遇到疑惑,建议查阅相关文档或资源以获取更多信息。
网络推广网站
- 手把手编写PHP框架 深入了解MVC运行流程
- Yii框架表单模型和验证用法
- AngularJS 防止页面闪烁的方法
- 原生js实现可拖拽效果
- 如何观看和欣赏大长今舞蹈视频
- javascript折半查找详解
- php操作csv文件代码实例汇总
- 常用的javascript设计模式
- vue-router 实现导航守卫(路由卫士)的实例代码
- PHP接入支付宝接口失效流程详解
- 完美的js图片轮换效果
- jquery的ajax提交form表单的两种方法小结(推荐)
- 使用PHP+AJAX让WordPress动态加载文章的教程
- JS验证IP,子网掩码,网关和MAC的方法
- vue初尝试--项目结构(推荐)
- 基于vuejs+webpack的日期选择插件