制作自己的MVC框架(一)——简单粗暴的实现
2023-02-18 16:46:55 时间
现在市面上有很多成熟的MVC框架,可以拿来直接用,但自己造一下轮子其实也挺有意思的。
下面先来看个最简单粗暴的MVC实现。
5个文件就能实现最简单的MVC,在Apache中设置一个虚拟目录,配置个简单域名,就可以顺利访问了。
为了实现简单,这里没有写模型层。
一、index.php
这个文件是入口文件,所有的请求就将会先进入到这个文件,然后再通过路由进入到不同的控制器中。
这就是常说的单一入口。
1. 我简单的将路由也放在了这个文件中。
2. 还将一个简单的全局常量放在了这里。
define('APP_PATH', dirname(__FILE__)); //路由逻辑 if(empty($_GET['c'])) { $uri = ltrim($_SERVER['REQUEST_URI'],'/'); $params = explode('/',$uri);//简单粗暴的将URL分割,例如index/action $controller = $params[0];//第一个变量是控制器名 $action = $params[1];//第二个是方法名 }else { $controller = $_GET['c'];//第二种域名访问方式 "pwstrick.com?c=index&a=action" $action = $_GET['a']; }
3. 再是引入试图的生成类和控制器类
4. 最终初始化这个控制器,就能实现访问了。
//初始化逻辑 require_once './view.php';//试图控制类 require_once APP_PATH . '/controller/'.$controller.'.php';//需要访问的控制器,例如index控制器 $handler = new $controller;//初始化这个控制器,例如index $handler->$action();//执行方法,也就是最终访问的那个地方
这样就完成了一次简单的访问,下图就是输入了一个简单URL,展示了view中的内容。
二、.htaccess
“.htaccess”是做路由用的,因为我用的服务器软件是Apache,所以需要,如果是Nginx就不需要。
这里将URL中的“index.php”干掉了,不然访问就需要多打这个,例如“index.php?c=index&a=action”。
这些参数具体的用法,可以上网自己查一下的。
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [L]
三、视图
市面上有很多模版引擎,很多都需要些学习成本。这里我用了PHP自带的Output Control相关函数。
下面的代码是“view.php”中的方法。
public function fetch($template, array $data = []) { $data = array_merge($this->attributes, $data); ob_start(); extract($data);//设置view上面的参数 include $this->templatePath . $template;//引入试图文件的绝对路径 $output = ob_get_clean();//输出页面 return $output; }
下面的代码是“view/index.php”中的代码,就仅仅是输出一个变量“$send”而已。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>badge</title> </head> <body> <strong><?php echo $send?></strong> </body> </html>
四、控制器
控制器在入口文件“index.php”中初始化了一下,并且也引用了一下指定的方法。
里面也没有使用到什么高大上的方法,就是在执行生成view的代码。
//一般都会继承一个通用的controller父类 class index { function action() { $view = new view(APP_PATH . '/view/');//初始化视图控制类 $output = $view->fetch( 'index.php',array('send' => '发送'));//指定要输出的视图名,并设置变量 echo $output; } }
这样就实现了一次简单MVC。
接下来会具体的做些逻辑的分层,添加一些通用的功能,路由,引入数据操作,配置文件等。
demo下载:
https://github.com/pwstrick/framework_demo
相关文章
- [javascript]使用正则替换url中最后面的斜杠
- [PHP]面向对象多态性的体现
- [操作系统]内存页面置换算法
- 在线客服系统源码开发实战总结:gin框架模板渲染html页面
- 在线客服系统源码开发实战总结:H5 Notifications浏览器桌面通知
- wordpress独立站宝塔面板配置HTTPS教程
- 宝塔面板出现“require(): open_basedir restriction in effect. ”的解决方法
- elementui的loading加载页面的使用方式
- javascript监听页面关闭事件
- 【小程序】微信小程序开发在app.json中新建页面时报[ WXML 文件编译错误] (env: Windows,mp,1.06.2206090; lib: 2.25.0)
- 【Linux】宝塔面板设置MySQL慢查询日志,未走索引日志
- 客服系统搭建教程_宝塔面板下安装使用方式_可对接公众号_支持APP/h5多租户运营
- [宝塔面板] 客服系统适配宝塔面板,实现软件商店=>导入项目=>一键部署私有云在线客服系统
- [html] 同一页面的跳转,锚文本的使用方法
- [PHP] 解决宝塔面板运行php项目 pcntl_fork() has been disabled for security reasons
- 论文解读丨无参数的注意力模块SimAm
- 华为云企业级Redis揭秘第15期:Redis为什么需要强一致?
- 带你了解AKG正反向算子注册+关联流程
- 软件开发除了23种设计模式,还有7个开发原则需要了解
- Sechunter移动应用隐私合规检测详解