作者:Terry Gao

1. 控制器

第一篇我们聊到路由分发会把用户请求按照规则分发到控制器层的不同类,而默认的规则中,请求会下发到控制器的index类的main方法,我们可以在这个方法中处理用户请求,并将处理结果呈现给用户。来看看源码

/* Nova/Application/Controllers/index.php */
<?php
namespace Nova\Application\Controllers;class index
{public function main(){echo "Hello World!";}
}

很基础,很简单,就是输出一个"Hello World!"。你会说“用户的请求呢?用户的请求体现在哪里?我没看出来啊!”

好吧,我们来稍微复杂一点。假设我们站点的域名是nova.local,用户请求地址:http://nova.local/?act=user&s...。根据Nova的路由规则,act=user意味着它请求的是NovaApplicationControllersuser.php的user类,st=info对应着user::info()方法,用来获取用户信息,而id=1则是user::info需要通过GET接收的一个参数,我们可以在user::info中对id进行解析和处理,获取id为1的用户信息,然后输出给用户。源代码如下:

/* Nova/Application/Controllers/user.php */
<?php
namespace Nova\Application\Controllers;
use Nova\Application\Models;class user
{public function info(){$mUser = new Models\user();$userInfo = $mUser->getUserInfo($_GET['id']);print_r($userInfo);}
}

上面的代码,没什么安全性可言,GET的信息没有任何过滤和校验,由于这个系列文章只是介绍基本的框架思路,所以这部分内容不是我们的重点,请暂且忽略(如果你实在看不下去如此ugly的代码,可以在Github上Fork Nova项目,然后提Pull Request给我)。

在info()方法中,我们新建了一个Modelsuser类,然后调用Modelsuser::getUserInfo()方法,来处理$_GET['id'],并将获取到的用户信息通过print_r()方法打印出来。这里的Modelsuser类就是MVC中M层的一个实现。

2. 模型层

我们可以将数据组织和处理逻辑放在模型层,这里封装了数据库操作,甚至有些大型的框架会在这一层对这个数据库进行对象化,目的都是为了组织和处理数据,然后将处理好的数据返回给控制器层。上一节提到的Modelsuser类就是一个专门用于处理用户数据的模型类,来看看源码:

/* Nova/Application/Models/user.php */
<?php
namespace Nova\Application\Models;
use Nova\Framework\PDOMysql;class user
{protected $db;public function __construct(){//使用PDO创建mysql数据库连接$this->db = PDOMysql::connect()->db;}/*** 根据用户id查询用户信息并返回查询结果** @return array*/public function getUserInfo($userId){$sql = 'select * from user where id=:userId';$stmt = $this->db->prepare($sql);$params = array(':userId' => $userId);$stmt->execute($params);return $stmt->fetch();}
}

这个类在构造的时候创建了一个数据库连接,然后在getUserInfo()方法中根据传入的用户id查询对应的用户信息,并将查询结果返回给调用者(控制器)。

通过下图来看看到目前为止,我们有什么了

好吧,看出来了,MVC的View没有。View层有一个好东西,也许你听过,甚至你用过,对,就是Smarty,这么好的东西拿来直接用吧。把Smarty的源码下载下来,然后统统解压到Nova/Application/Library/Smarty下面,我们要怎么把Smarty加载进来呢?首先改造一下Controller层,新建一个Controllersbase.php,作为控制器层的基类,在这里我们引入并初始化一下Smarty,代码如下:

/* Nova/Application/Controllers/base.php */
<?php
namespace Nova\Application\Controllers;
//引入Smarty的Autoloader
require_once APP_DIR . '/Library/Smarty/Autoloader.php';class base
{public $smarty;public function __construct(){//调用Smarty的Autoloader\Smarty_Autoloader::register();//创建Smarty的一个实例化对象$this->smarty = new \Smarty();//对smarty做一些基本设置//设置模板的存放位置$this->smarty->setTemplateDir(APP_DIR.'/Views/');//smarty编译文件的存储位置$this->smarty->setCompileDir(ROOT_DIR.'/compiled/');//设置smarty配置文件的存放位置$this->smarty->setConfigDir(CONFIG_DIR.'/smarty/');//smarty自带缓存,设置缓存的存储位置$this->smarty->setCacheDir(ROOT_DIR.'/cache/');}
}

然后我们让Controllersuser继承Controllersbase,就可以使用smarty了

/* Nova/Application/Controllers/user.php */
<?php
namespace Nova\Application\Controllers;
use Nova\Application\Models;class user extends base
{public function info(){$mUser = new Models\user();$userInfo = $mUser->getUserInfo($_GET['id']);//将数据传入给smarty$this->smarty->assign('user', $userInfo);//通过smarty的display函数,调用index.tpl模板来显示数据$this->smarty->display('index.tpl');}
}

模板代码如下:

/* Nova/Application/View/index.tpl */
<div>User Name: {$user['name']}</div>
<div>Password: {$user['password']}</div>

至此,MVC齐全了,整个架子搭起来喽。运行一下试试看吧。
你可以在Github上查看Nova项目的源代码。

如果你有任何问题或建议,可以扫描下方二维码或者微信搜索[phpjiagoushier],关注我的微信公众号[PHP架构],与我交流互动。

自己动手写PHP框架(三)相关推荐

  1. 自己动手写ORM框架

    自己动手写ORM框架(九):实现删除功能Remove方法 奋斗 2010-07-03 19:29 阅读:1962 评论:6   自己动手写ORM框架(八):实现修改功能Update方法 奋斗 2010 ...

  2. java笔记:自己动手写javaEE框架(七)--使用JSON和Ajax技术

    今天我要将json和ajax引入到我所写的框架,不过今天用到的技术有部分不是我框架最终使用到的技术,比如ajax技术,我用到的是最为原始的ajax技术,这次算是对老技术的回顾,不过不管技术如何演进,对 ...

  3. 核心技术靠化缘是要不来的——自己动手写ORM框架

    开源市场上的Java的ORM框架一个都不好用,所以花了几天时间自己撸了一个 OrmKids,欢迎大家下载学习.遇到问题请关注公众号进群大家一起讨论. OrmKids 支持分库分表的MySQL单表ORM ...

  4. 自己动手写spring(三) 支持注解方式

    前言 本文使用注解方式来读取bean类,并解决bean之间的依赖.其中Component和Value注解直接copy自Spring,Resource注解来自javax. 扫描包中的所有类 还是以前文提 ...

  5. 自己动手写ORM框架(六):实现查询功能FindById方法

    通过配置实体与表的关系映射后,就可以实现对表的操作了,接下来实现简单对象的新增功能.下面代码1-1是定义的操作数据对象方法的接口: using System; using System.Collect ...

  6. 自己动手写操作系统第三章pmtest7源码解析——检测系统内存

    摘要:在pmtest6.asm中,我们已经初步接触了分页机制,但是很显然,上述分页机制浪费比较严重,而且没有体现应有的用处.本节,我们主要介绍如何根据内存容量,恰当地分配页表. 一.理论基础 1.如何 ...

  7. java笔记:自己动手写javaEE

    写这篇博客前,我有个技术难题想请教大家,不知道谁有很好的建议,做过互联网的童鞋应该都知道,有点规模的大公司都会做用户行为分析系统,而且有些大公司还会提供专业的用户行为分析解决方案例如:百度分析,goo ...

  8. php怎么自己写框架,PHP学习笔记,自己动手写个MVC的框架

    最新在大家自己的博客的过程中,发现各种开源的博客系统都或多或少的用起来别扭.于是想动手自己写个博客系统.既然写,就想好好写.那就先写个MVC框架.一点一点来.写的过程中有很多想法.还希望大家能够多多指 ...

  9. 自己动手写一个分库分表中间件(三)数据源路由实现

    相关文章: 自己动手写一个分库分表中间件(一)思考 自己动手写一个分库分表中间件(二)数据源定义和分片代理层设计 排查项目中读写分离失效原因 小议 Java 内省机制 注:本文内容暂不涉及事务相关的问 ...

  10. 自己动手写决策树(一)——初步搭建决策树框架

    数挖实验课的时候,老师让我们自己动手写决策树,还不能调用 scikit-learn 包,顿时感觉有点难(可能是我比较菜),想到网上找一找看能不能学一下,可是许多大佬都是调包做的,剩下的大佬们写的代码也 ...

最新文章

  1. unity开发小贴士之八 Audio使用心得
  2. 没水?没电?从非洲难民到美国华盛顿知名游戏开发者,有梦想的人,世界会为他让路!...
  3. Oracle 12c 多租户 CDB 与 PDB之 shared undo 与 Local undo 切换
  4. Python JAVA Solutions for Leetcode
  5. android jni new/delete 和 new[]/delete[]
  6. BAdI implementation in ABAP workbench dispatch event
  7. 智慧政务解决方案(28页)pdf_【金众电子】智慧政务解决方案
  8. jQuery模拟原生态App上拉刷新下拉加载效果代码
  9. 经验分享:java批量读取txt文件入库
  10. 关于 hystrix 的异常 fallback method wasn‘t found
  11. 为什么要学习Kotlin
  12. Cordova原理一
  13. 基于VHD和grub4dos的秒还原系统
  14. pmon构建过程分析
  15. python xlsxwriter模块生成EXCEL柱状图、饼图
  16. .gitignore文件写法
  17. h5 ios 切入后台运行倒计时问题
  18. 微信开放平台创建移动应用-必过
  19. 终于明白为什么人人都爱Django了,Django果然天下第一
  20. python qq群发消息_Python版QQ群发消息

热门文章

  1. python文件处理——文件读写
  2. 清华计算机科学与技术专业收分,2016年清华大学计算机科学与技术专业最低分是多少?...
  3. HTMl中3d变换卡片制作方法,CSS如何实现卡片3D翻转效果
  4. android获取root修改根目录,代码中获取root权限并随意修改根目录文件
  5. python百度关键词爬虫_python批量获取百度关键词相关结果数
  6. java游戏开发总结_java--游戏后端--项目开发总结6--资源下载
  7. java文件读取的几个操作-2
  8. 查看Linux版本命令
  9. Arts 第九周(5/13 ~ 5/19)
  10. eyoucms 网页制作软件有哪些 这些你都知道吗