制作自己的MVC框架(一)——简单粗暴的实现
现在市面上有很多成熟的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
制作自己的MVC框架(一)——简单粗暴的实现的更多相关文章
- cocos2dx之lua项目开发中MVC框架的简单应用
**************************************************************************** 时间:2015-03-31 作者:Sharin ...
- 制作自己的MVC框架(三)——应用
一.数据库操作 目前封装了两种数据库,“MongoDB”和“MySQL”,用到了一次接口“IDatabase.php”. namespace library\db; interface IDataba ...
- 开源一个windows下的定时任务框架,简单粗暴好用。
这里是你想要的功能: 支持插件,将你要执行的任务编译成程序集放到框架的根目录下,再进行简单的配置就行了. 支持Corn表达式.想让任务在什么时候执行就在什么时候执行. 支持安装成windows ser ...
- 制作自己的MVC框架(二)——启动
自己写了个框架,取名为“PrimusPHP”,就3个文件夹,log中是日志文件,会自动生成. app中就是控制器和视图,public中是入口文件和静态资源,library中既有框架的核心类,还有工具类 ...
- PHP学习笔记(4) - 实现自己的MVC框架
在PHP中实现一个所谓的MVC框架非常简单.这里说一下思路. 一.首先用spl_autoload_register函数实现自己的类型自动加载机制.这样其他代码都不需要再考虑如何将类所在的文件inclu ...
- 使用Intellij Idea自定义MVC框架
---恢复内容开始--- 今天我学习了自定义一个简单的MVC框架,这个我们首先要知道什么是MVC框架! MVC框架: MVC全名是Model View Controller,是模型(model)-视图 ...
- 自己写一个java的mvc框架吧(三)
自己写一个mvc框架吧(三) 根据Method获取参数并转换参数类型 上一篇我们将url与Method的映射创建完毕,并成功的将映射关系创建起来了.这一篇我们将根据Method的入参参数名称.参数类型 ...
- DotnetBrowser高级教程-(4)使用MVC框架1-搭建基础框架
我们这次重点介绍下MVC框架的使用. 如果您之前使用过微软的mvc web框架,那么dotnetbrowser的mvc框架相信您也会很快上手,两者之间相似度约有80%. 所谓的mvc,以一个例子为例: ...
- MVC其实很简单(Django框架)
Django框架MVC其实很简单 让我们来研究一个简单的例子,通过该实例,你可以分辨出,通过Web框架来实现的功能与之前的方式有何不同. 下面就是通过使用Django来完成以上功能的例子: 首先,我们 ...
随机推荐
- [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?
你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...
- How those spring enable annotations work--转
原文地址:http://blog.fawnanddoug.com/2012/08/how-those-spring-enable-annotations-work.html Spring's Java ...
- 从Vue.js窥探前端行业
近年来前端开发趋势 1.旧浏览器逐渐淘汰,移动端需求增加: 旧浏览器主要指的是IE6-IE8,它是不支持ES5特性的:IE9+.chrome.sarafi.firefox对ES5是完全支持的,移动端大 ...
- ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存
ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存 part 1:给我点时间,允许我感慨一下2016年 正好有时间,总结一下最近使用的一些技术,也算是为2016年画上一个完 ...
- Python(九)Tornado web 框架
一.简介 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过 ...
- 模仿Linux内核kfifo实现的循环缓存
想实现个循环缓冲区(Circular Buffer),搜了些资料多数是基于循环队列的实现方式.使用一个变量存放缓冲区中的数据长度或者空出来一个空间来判断缓冲区是否满了.偶然间看到分析Linux内核的循 ...
- Take into Action!
很久没有认真地写文字了. 刚毕业一两年断断续续在csdn上写过一些当时的工作记录,然后没有坚持下去.有时候是觉得自己不牛,记录的东西旁人看起来也许不值一提:有时候觉得结婚生娃了,然后时间不够用(确实是 ...
- Linux LVM逻辑卷配置过程详解
许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估不准确,一旦系统分区不够用时可能不得不备份.删除相关数据,甚至被迫重新规划分区并重装操作系统,以 ...
- 一步步开发自己的博客 .NET版(1、基本显示)
前言 我们每个猿都有一个搭建自己独立博客的梦,我也不例外.以前想 现在想 以后也想.之所以一直迟迟没有着手,是因为难以跨出第一步.每次心里想着,等我以后技术好了再说,然后就没有然后了.以前用过word ...
- 【Web动画】CSS3 3D 行星运转 && 浏览器渲染原理
承接上一篇:[CSS3进阶]酷炫的3D旋转透视 . 最近入坑 Web 动画,所以把自己的学习过程记录一下分享给大家. CSS3 3D 行星运转 demo 页面请戳:Demo.(建议使用Chrome打开 ...