现在市面上有很多成熟的MVC框架,可以拿来直接用,但自己造一下轮子其实也挺有意思的。

下面先来看个最简单粗暴的MVC实现。

5个文件就能实现最简单的MVC,在Apache中设置一个虚拟目录,配置个简单域名,就可以顺利访问了。

为了实现简单,这里没有写模型层。

一、index.php

这个文件是入口文件,所有的请求就将会先进入到这个文件,然后再通过路由进入到不同的控制器中。

这就是常说的单一入口

1. 我简单的将路由也放在了这个文件中。

2. 还将一个简单的全局常量放在了这里。

  1. define('APP_PATH', dirname(__FILE__));
  2.  
  3. //路由逻辑
  4. if(empty($_GET['c'])) {
  5. $uri = ltrim($_SERVER['REQUEST_URI'],'/');
  6. $params = explode('/',$uri);//简单粗暴的将URL分割,例如index/action
  7. $controller = $params[0];//第一个变量是控制器名
  8. $action = $params[1];//第二个是方法名
  9. }else {
  10. $controller = $_GET['c'];//第二种域名访问方式 "pwstrick.com?c=index&a=action"
  11. $action = $_GET['a'];
  12. }

3. 再是引入试图的生成类和控制器类

4. 最终初始化这个控制器,就能实现访问了。

  1. //初始化逻辑
  2. require_once './view.php';//试图控制类
  3. require_once APP_PATH . '/controller/'.$controller.'.php';//需要访问的控制器,例如index控制器
  4. $handler = new $controller;//初始化这个控制器,例如index
  5. $handler->$action();//执行方法,也就是最终访问的那个地方

这样就完成了一次简单的访问,下图就是输入了一个简单URL,展示了view中的内容。

二、.htaccess

“.htaccess”是做路由用的,因为我用的服务器软件是Apache,所以需要,如果是Nginx就不需要。

这里将URL中的“index.php”干掉了,不然访问就需要多打这个,例如“index.php?c=index&a=action”。

这些参数具体的用法,可以上网自己查一下的。

  1. RewriteEngine on
  2. RewriteCond %{REQUEST_FILENAME} !-d
  3. RewriteCond %{REQUEST_FILENAME} !-f
  4. RewriteRule ^(.*)$ index.php/$1 [L]

三、视图

市面上有很多模版引擎,很多都需要些学习成本。这里我用了PHP自带的Output Control相关函数。

下面的代码是“view.php”中的方法。

  1. public function fetch($template, array $data = []) {
  2. $data = array_merge($this->attributes, $data);
  3. ob_start();
  4. extract($data);//设置view上面的参数
  5. include $this->templatePath . $template;//引入试图文件的绝对路径
  6. $output = ob_get_clean();//输出页面
  7. return $output;
  8. }

下面的代码是“view/index.php”中的代码,就仅仅是输出一个变量“$send”而已。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>badge</title>
  6. </head>
  7. <body>
  8. <strong><?php echo $send?></strong>
  9. </body>
  10. </html>

四、控制器

控制器在入口文件“index.php”中初始化了一下,并且也引用了一下指定的方法。

里面也没有使用到什么高大上的方法,就是在执行生成view的代码。

  1. //一般都会继承一个通用的controller父类
  2. class index {
  3. function action() {
  4. $view = new view(APP_PATH . '/view/');//初始化视图控制类
  5. $output = $view->fetch( 'index.php',array('send' => '发送'));//指定要输出的视图名,并设置变量
  6. echo $output;
  7. }
  8. }

这样就实现了一次简单MVC。

接下来会具体的做些逻辑的分层,添加一些通用的功能,路由,引入数据操作,配置文件等。

demo下载:

https://github.com/pwstrick/framework_demo

制作自己的MVC框架(一)——简单粗暴的实现的更多相关文章

  1. cocos2dx之lua项目开发中MVC框架的简单应用

    **************************************************************************** 时间:2015-03-31 作者:Sharin ...

  2. 制作自己的MVC框架(三)——应用

    一.数据库操作 目前封装了两种数据库,“MongoDB”和“MySQL”,用到了一次接口“IDatabase.php”. namespace library\db; interface IDataba ...

  3. 开源一个windows下的定时任务框架,简单粗暴好用。

    这里是你想要的功能: 支持插件,将你要执行的任务编译成程序集放到框架的根目录下,再进行简单的配置就行了. 支持Corn表达式.想让任务在什么时候执行就在什么时候执行. 支持安装成windows ser ...

  4. 制作自己的MVC框架(二)——启动

    自己写了个框架,取名为“PrimusPHP”,就3个文件夹,log中是日志文件,会自动生成. app中就是控制器和视图,public中是入口文件和静态资源,library中既有框架的核心类,还有工具类 ...

  5. PHP学习笔记(4) - 实现自己的MVC框架

    在PHP中实现一个所谓的MVC框架非常简单.这里说一下思路. 一.首先用spl_autoload_register函数实现自己的类型自动加载机制.这样其他代码都不需要再考虑如何将类所在的文件inclu ...

  6. 使用Intellij Idea自定义MVC框架

    ---恢复内容开始--- 今天我学习了自定义一个简单的MVC框架,这个我们首先要知道什么是MVC框架! MVC框架: MVC全名是Model View Controller,是模型(model)-视图 ...

  7. 自己写一个java的mvc框架吧(三)

    自己写一个mvc框架吧(三) 根据Method获取参数并转换参数类型 上一篇我们将url与Method的映射创建完毕,并成功的将映射关系创建起来了.这一篇我们将根据Method的入参参数名称.参数类型 ...

  8. DotnetBrowser高级教程-(4)使用MVC框架1-搭建基础框架

    我们这次重点介绍下MVC框架的使用. 如果您之前使用过微软的mvc web框架,那么dotnetbrowser的mvc框架相信您也会很快上手,两者之间相似度约有80%. 所谓的mvc,以一个例子为例: ...

  9. MVC其实很简单(Django框架)

    Django框架MVC其实很简单 让我们来研究一个简单的例子,通过该实例,你可以分辨出,通过Web框架来实现的功能与之前的方式有何不同. 下面就是通过使用Django来完成以上功能的例子: 首先,我们 ...

随机推荐

  1. C# 发送邮件 附件名称为空

     示例代码: // 1.创建邮件 MailMessage mailMsg = new MailMessage(); mailMsg.To.Add(new MailAddress("test@ ...

  2. Python列表去重

    标题有语病,其实是这样的: 假设有两个列表 : L1 = [1,2,3,4] ; L2 = [1,2,5,6] 然后去掉L1中包含的L2的元素 直接这样当然是不行的: def removeExists ...

  3. html5 与视频

    1.视频支持格式. 有3种视频格式被浏览器广泛支持:.ogg,.mp4,.webm. Theora+Vorbis=.ogg  (Theora:视频编码器,Vorbis:音频编码器) H.264+$$$ ...

  4. js学习之函数的参数传递

    我们都知道在 ECMAScript 中,数据类型分为原始类型(又称值类型/基本类型)和引用类型(又称对象类型):这里我将按照这两种类型分别对函数进行传参,看一下到底发生了什么. 参数的理解 首先,我们 ...

  5. Effective java笔记(二),所有对象的通用方法

    Object类的所有非final方法(equals.hashCode.toString.clone.finalize)都要遵守通用约定(general contract),否则其它依赖于这些约定的类( ...

  6. 使用nginx反向代理,一个80端口下,配置多个微信项目

    我们要接入微信公众号平台开发,需要填写服务器配置,然后依据接口文档才能实现业务逻辑.但是微信公众号接口只支持80接口(80端口).我们因业务需求需要在一个公众号域名下面,发布两个需要微信授权的项目,怎 ...

  7. JS高级前端开发群加群说明及如何晋级

    JS高级前端开发群加群说明 一.文章背景: 二. 高级群: 三. 加入方式: 四. 说明:   一.文章背景: 去年年初建了几个群,在不经意间火了,一直排在“前端开发”关键字搜索结果第一名.当然取得这 ...

  8. mono-3.4.0 源码安装时出现的问题 [do-install] Error 2 [install-pcl-targets] Error 1 解决方法

    Mono 3.4修复了很多bug,继续加强稳定性和性能(其实Mono 3.2.8 已经很稳定,性能也很好了),但是从http://download.mono-project.com/sources/m ...

  9. XCodeGhost表明:为了安全,开发工具应该从官方网站下载

    今天的热门话题就是XCode编译器,这个神器在火热的移动互联网浪潮下也被人利用了,据文章分析 (XCode编译器里有鬼 - XCodeGhost样本分析)http://www.huochai.mobi ...

  10. CSharpGL(28)得到高精度可定制字形贴图的极简方法

    CSharpGL(28)得到高精度可定制字形贴图的极简方法 回顾 以前我用SharpFont实现了解析TTF文件从而获取字形贴图的功能,并最终实现了用OpenGL渲染文字. 使用SharpFont,美 ...