自己动手设计 PHP MVC 框架(一)——URL

自适应滤波器原理与MATLAB仿真:LMS与RLS算法对比及工程应用 在信号处理与系统辨识中,自适应滤波器是一类无需精确先验统计知识即可在线调整参数的滤波结构。它通过实时误差驱动权值迭代,能够有效应对噪声统计特性未知或时变的环境,广泛应用于噪化信号增强、噪声抵消、信道均衡与系统辨识。LMS算法以瞬时梯度近似统计梯度,结构简单、计算量小,但收敛速度受步长因子制约;RLS算法利用矩阵求逆引理递推更新逆相关矩阵,收敛快但计算复杂度较高,且数值稳定性需谨慎维护。FIR结构因其全极点位于原点、固有稳定,成为工程实现的主流选择。通过MATLAB仿真可直观观察步长对收敛与稳态失调的影响,并 阅读详情

在框架盛行的今天,MVC 也不再是神话。 经常听到很多程序员讨论哪个框架好,哪个框架不好, 其实 框架只是工具,没有好与不好,只有适合与不适合,适合自己的就是最好的。

每次我面试应届生时都会问他使用过什么框架,并谈谈对这些框架的理解。 当面试有经验的程序员时,会让他自己写一个框架出来。 其实也不是让他编码,只要有思路就 OK 了。 我觉得,如果一个有一年经验的程序员连一个 Framework v0.0.1 都开发不出来的话,肯定是没有深入理解一个框架。

前几天 @phoenixg 说要自己写个 MVC 框架。 而且他也确实不仅仅是说说而已,短短一个周末,这个框架雏形就神奇的出现在了 github 上。

这篇博文的名字是『自己动手设计 PHP MVC框架』, 所以本文不会涉及太多的编码,文中出现的任何代码片段都是我直接在 vim 里面敲的, 没做任何测试,如果想使用文中代码需自行测试。

跟随本教程,将从零开始设计一个属于自己的 MVC 框架。

我使用过 ZendFramwork、CodeIgniter,每个框架都有自己的优点和不足。 在写本文之前,我又看了 Symfony、cakephp、MooPHP、doitphp 等的核心源码, 下面说说我将把我的框架设计成什么样子,这一章主要讨论 URL 的设计。

1. REST

在这个 REST 横行的时代,如果一个框架不支持 REST,肯定被前卫程序员所瞧不起,所以本框架也要支持 REST。

第一个设计准则: 所有东西都是资源,资源有多种表现形式。

不管实际上存在的,还是抽象上的, 所有资源都会有一个不变的标识(ID),对资源的任何 API 操作都不应该改变资源的标识。

事实上,上面的这些完完全全是按照互联网的特性提出来的。

  • 互联网中,一个 URL 就是一个资源;
  • 资源的内容就是 HTML 页面;
  • 不管怎么改 HTML 内容,URL 都不会改变;
  • 资源之间通过 HTML 里的连接联系起来;
  • 每次获取的时候,获取到的都是完整的 HTML 内容。

比如

GET http://justjavac.com/users         // 所有用户
GET http://justjavac.com/users/phper   // 标识为phper的用户

2. 扩展名

在此我不讨论扩展名和文件类型之间的关系,以及“扩展名只是约定,而文件类型记录在文件头”。

我通常把扩展名理解为“约定”,而不是文件类型。 当我们请求一个 news.html 时,我们并不能确信它就是一个存在于服务器上的news.html文件, 它也可能是php文件,也可能是jsp文件,在nodejs流行的今天,它也可能是一个js文件。 但不管页面是如何生成的,有一点是明确的——最终我们得到了一个html文档。

虽然rest不要求使用扩展名,但有人告诉我,如果在一个女生名字后面加一个.rmvb 的扩展名,将变得非常……因此本框架将支持扩展名,但是扩展名并是资源的一部分。

什么意思呢?

还是前面的例子,所有用户这个资源该如何表示呢? 用 url http://justjavac.com/users 就可以唯一标识, 而 扩展名可以用来标识资源的不同表现形式。

a、当我们请求 http://justjavac.com/users 时,框架将返回一个html文档, 数据可能在表格中,也可能在 form 中,也可能在 div 中(如下图)。

table of users

b、当我们请求 http://justjavac.com/user.json 时,将返回 json 格式数据。

[
    {
        "firstName" : "just",
        "lastName" : "javac",
        "userName" : "@justjavac"
    },
    {
        "firstName" : "Tom",
        "lastName" : "Cat",
        "userName" : "@tomcat"
    },
    ……
]

c、当我们请求 http://justjavac.com/user.xml 时, 将返回 xml 格式的数据,xml 文档可由 DTD 或者 XSD 定义。

d、如果我们想把所有用户的列表发给管理员,或者打印出来呢?

可以直接访问 http://justjavac.com/user.xls,框架将会返回 Excel 电子表格。 当我们高高兴兴把文件下载下来,却发现电脑没有安装 Excel,怎么办? 没关系,我们还可以访问http://justjavac.com/user.jpg,毕竟看图工具我们还是有的。

用过 Google 短网址服务的同学都知道,比如我的网站 http://justjavac.com 的短网址是 http://goo.gl/JMQJ8,Google 还提供了二维码表示法,只需要在后面添加 .qr 例如 http://goo.gl/JMQJ8.qr。

taourl 也提供了一个很方便的功能,例如 我们想查看网址 http://taourl.com/7c1ug 的访问情况,那么只需要在网址最后面添加一个+号就可以了。


总之,不管用了什么扩展名,将返回同一个资源,只是表现形式不同罢了。 这也就是经常所说的 数据 + 模板 = 输出。

如果没有扩展名呢?返回 HTML 文档?

别忘了 http 请求的 Accept。 设置请求头的 Accept: application/x-excel 我们依然可以得到一个电子表格。

甚至当我们访问某个用户时, http://justjavac.com/user/justjavac,我们可以使用 Accept: text/x-vcard,如果不知道嘛意思,自己Google去。

justjavac.vcard

下面说说设计模式,在这个功能上,可以用一个适配器模式,根据不同的扩展名选择不同的适配器,执行不同的功能,最后提供相同的接口,具体实现就不多说了。

3. 多语言支持

@TODO 多语言支持的 url 结构设计

4. 充分利用 HTTP

和请求有关的错误和其他重要的状态信息怎么办呢?

简单,使用 HTTP 的状态码! 通过使用 HTTP 状态码,你不需要为你的接口想出 error/success 规则,它已经为你做好。

比如:假如一个消费者提交数据(POST)到 /api/users,

  • 你需要返回一个成功创建的消息,此时你可以简单的发送一个 201 状态码(201=Created)。
  • 如果失败了,服务器端失败就发送一个 500(500=内部服务器错误),
  • 如果请求中断就发送一个 400(400=错误请求)。
  • 也许他们会尝试向一个不接受 POST 请求的接口提交数据,你就可以发送一个 501 错误(未执行)。
  • 又或者你的 MySQL 服务器挂了,接口也会临时性的中断,发送一个503错误(服务不可用)。

幸运的是,你已经知道了这些,假如你想要了解更多关于状态码的资料,可以在维基百科上查找。

HTTP 支持客户端缓存,在HTTP响应里利用 Cache-Control,Expires,Last-Modified 三个头字段, 我们可以让浏览器缓存资源一段时间。

REST 也可以利用这些头,告诉客户端在一定时间内不需要再次请求资源。 这对提高性能有很大好处。Expires、Last-Modified 以及 ETag 可以通过资源的属性提供,这个在有关 Model 层的设计中再详细介绍。

5. 测试与调试

PHP 的灵活使得自动化测试或者 TDD 变得困难,至少和 Java 比就差了好大一截。 在框架中,将很自由的开启调试,比如我的设计是通过添加 url 参数:

http://justjavac.com/user/justjavac?DEBUG=2

通过添加 DEBUG 参数告诉框架开启调试模式,后面的参数值是调试的级别 level。 类似的,你也可以加入 LOG 参数来启动日志。

这样设计还有一个好处就是,不需要修改配置文件,而且还可以 针对某一个页面来开启或者关闭。 当我用 CI 时,每次我发现程序中的问题,都在配置文件中将 log 级别设置为 all, 再重新打开页面,当我再看 log 文件时,居然已经几百行了,因为我访问的每个页面都被记录到了日志里面。

测试和 url 好像没有多大关系,测试放在单独的章节讨论。 我为测试约定的 url 是添加 test,比如为控制器 justjavac.controller.php 写的测试用例(Test Case)可以通过http://justjavac.com/test/user/justjavac 访问。

但我还是比较喜欢在命令行测试,毕竟当你手动点击浏览器,并手动输入 url, 手动敲回车键时,已经违背了自动化测试。

6. Ajax

@TODO 应用于单页 Ajax 的 url 结构设计


PHP简单实现MVC框架路由功能源码 立即下载

相关推荐

PHP简单实现MVC框架路由功能源码(原作者代码有误,已修改)

说到使用PHP进行网站开发,自然离不开各种PHP的开发框架,开发框架为我们提供了灵活的开发方式,MVC层分离,业务解耦等等,让我们的开发更为快捷方便。但是很多人只是会使用框架,却从来不去了解框架的内部是如何实现的,这对于我们编程能力的提高是没有一点用处的。那么这一篇博文,我们就先来一个简单点的功能,也就是说说MVC框架的路由功能实现方法。

thinkphp框架学习之MVC模式初步实现

在app/index/创建model文件夹,新建模型文件(每一个模型文件都代表数据库的一张表)   一、例如创建User.php,地址为app/index/model/,创建格式如下: <?php namespace app\index\model; use think\Model; class User extends Model { } 二、创建该模型文件的控制器文件User...

u012865864的博客 1319

单细胞多组学数据整合分析实战:从原始数据到跨平台合并

本文详细介绍了单细胞多组学数据整合分析的实战流程,从原始数据处理到跨平台合并分析。通过Seurat和Harmony等工具的应用,帮助研究者有效解决批次效应问题,保留真实的生物学信号。文章包含代码示例和常见问题解决方案,特别适合需要进行单细胞合并分析的研究人员参考。

weixin_30752699的博客 89

1小时内打造你自己的PHP MVC框架

这是一篇非常精简的文章去介绍如何去建立一个微型PHP MVC框架,希望可以阐释清楚MVC框架中的一些关键概念。

Rocky.Zhao的笔记 7696

想学嵌入式但没开发板?试试这个免费的STM32虚拟仿真平台(含LVGL界面教程)

本文介绍如何利用免费的STM32虚拟仿真平台学习嵌入式开发,特别适合预算有限或零硬件基础的学习者。通过详细的LVGL界面开发教程,展示虚拟仿真在嵌入式学习中的高效性和实用性,涵盖环境搭建、代码实现到实机迁移的全流程,助力快速掌握嵌入式开发核心技能。

weixin_29266647的博客 306

Python爬虫实战:5分钟搞定Web of Science文献批量导出与解析(附完整代码)

本文提供了一套利用Python爬虫技术,快速实现Web of Science文献批量提取与解析的完整方案。通过解析官方导出的HTML文件,结合BeautifulSoup和pandas库,可将文献数据自动转换为结构化的Excel/CSV表格,帮助科研人员高效管理文献信息,节省大量手动整理时间。

weixin_29050513的博客 1164

使用PHP搭建自己的MVC框架

使用PHP搭建自己的MVC框架 一、什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。 MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂...

dkopg24406的专栏 1051

PHP+MYSQL宠物主题动态网页设计源码+数据库,大学生期末大作业,PHP课程设计

PHP+MYSQL宠物主题动态网页设计源码+数据库,大学生期末大作业,PHP课程设计提示:本文采用PHP对数据库进行操作:本文就介绍了PHP实现对MySQL数据库的增删改查操作基础内容。

899

php laravel mvc模式,构造一个仿Laravel Mvc框架 - 路由篇

在我们日常使用Laravel框架中,有很多值得我们学习的设计理念和开发思想,如何代码变得更加“优雅”,核心架构中组件化、服务容器、数据库ORM 都是很值得我们去探究一二的方向。在本系列博客中,将利用 Laravel 中组件化的特点来构建一个迷你 仿 Laravel 的 MVC框架。本篇的应用主要是讲述,如何利用 illuminate/routing 来实现框架的路由模块,通过配置的定义来实现请求的...

weixin_39626089的博客 271

【实战指南】基于YOLOv11的肺结节检测系统开发与优化(LUNA2016数据集)

本文提供了基于YOLOv11模型和LUNA2016数据集开发肺结节检测系统的完整实战指南。详细介绍了从环境搭建、数据预处理、模型训练与优化,到构建Web应用系统的全流程,旨在帮助开发者快速掌握医疗影像AI项目的核心开发技能。

weixin_29031057的博客 140

python中frida的安装+frida-server(雷电模拟器)保姆级安装教程

frida的安装,安卓逆向,adb

2301_80224944的博客 4578

自己动手设计 PHP MVC 框架(一)——URL (转载)

在框架盛行的今天,MVC 也不再是神话。 经常听到很多程序员讨论哪个框架好,哪个框架不好, 其实框架只是工具,没有好与不好,只有适合与不适合,适合自己的就是最好的。 每次我面试应届生时都会问他使用过什么框架,并谈谈对这些框架的理解。 当面试有经验的程序员时,会让他自己写一个框架出来。 其实也不是让他编码,只要有思路就 OK 了。 我觉得,如果一个有一年经验的程序员连一个 Framework v...

weixin_30707875的博客 83

HighTec安装使用

HighTec安装使用

qq_43552564的博客 3833

自己动手写PHP MVC框架

来自:yuansir-web.com / yuansir@live.cn  代码下载: https://github.com/yuansir/tiny-php-framework PHP的框架众多,对于哪个框架最好,哪个框架最烂,是否应该用框架,对于这些争论在论坛里面都有人争论,这里不做评价,  个人觉得根据自己需求,选中最佳最适合自己MVC框架,并在开发中能够体现出敏捷开发的效果就OK了,

爱代码也爱生活 5904

微信小程序|基于小程序实现定位打卡功能

此文主要在小程序内实现打卡功能,可根据用户位置与公司设定的打卡范围实时判断打卡是否合法,并在后台对打卡记录进行管理。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

PHP实现简易的MVC框架

实现MVC框架没有固定的实现方法,根据框架特色和语言特点以及自己的需求进行实现即可。

光头强的博客 7139

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

PHP MVC框架初探

前言 下面准备审一下Yii、laravel、tp,但这些框架都是基于MVC模式的,所以先简单了解下MVC模式。 MVC是什么 MVC(Model-View-Controller)是软件工程的一种软件架构模式。 在MVC模式设计下,软件系统被分来三个模块:模型(Model)、视图(VIew)、控制器(Controller)。 Model(模型):是应用程序中用于处理应用程序数据逻辑的部分,通常负责与数据库直接进行 curd 的交互。 View(视图):是应用程序处理数据显示的部分,通过将处理好的数据进

Sentiment的博客 1861

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

controller层要写什么_自己动手写PHP MVC框架

PHP的框架众多,对于哪个框架最好,哪个框架最烂,是否应该用框架,对于这些争论在论坛里面都有人争论,这里不做评价, 个人觉得根据自己需求,选中最佳最适合自己MVC框架,并在开发中能够体现出敏捷开发的效果就OK了,作为一个PHPer要提高自己的对PHP和MVC的框架的认识,所以自己写一个MVC框架是很有必要的, 即使不是很完善,但是自己动手写一个轻量简洁的PHP MVC框架起码对MVC的思想有一定的...

weixin_30099269的博客 992

开发自己PHP MVC框架

这个教程可以使大家掌握用mvc模式开发php应用的基本概念。此教程分为三个部分,现在这篇是第一部分。 现在市面上有很多流行的框架供大家使用,但是我们也可以自己动手开发一个mvc框架,采用mvc模式可以大大减少我们开发应用的时间,并且能够更好的组织项目源代码,而且其中的某些模块还可在其它项目中使用。现在我要教大家写一个简单的mvc框架。由于这个项目很简单,轻量,所以可能并不是最佳实践,也不具备

爱代码也爱生活 6786

动手构建简单PHP mvc框架,简单快速打造你自己的PHP MVC框架

简单快速打造你自己的PHP MVC框架简介MVC框架在现在的开发中相当流行,不论你使用的是JAVA,C#,PHP或者IOS,你肯定都会选择一款框架。虽然不能保证100%的开发语言都会使用框架,所以最好的理解MVC的方法就是写一个你自己的MVC框架。兄弟连www.lampbrother.net在这篇文章中将会向你展示如何构建一个自己的MVC框架。MVC架构模式M: Model-模型V: View-视...

weixin_30301989的博客 212
上一篇: 你为什么薪水那么低(二)之 生产力
下一篇: 代码之谜(二) - 语句与表达式
迷渡
迷渡 领域专家: 前端开发技术领域 领域专家: 前端开发技术领域
博客等级 码龄19年 2405粉丝 124原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值