在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
接上篇 单点入口 。 有个现实的比喻很符合这个MVC模式,那时候应该还用纸写信,大家把信件投递到邮筒,邮递员将信件全部收集起来,然后再根据他们的收件地址进行分发; 如果邮资不够或地址不明确则退回邮件,还有些可能会因为各种原因丢失,比如被人偷了,邮递员不小心寄错了,等等,但是其他的都会到达最后的目的地, 收到信的感觉还是很美妙的。程序设计的思想,我想大都来于现实,来于人们长久积累的经验和智慧;但是高于这些,因为它们是对现实的抽象,在抽象的表象下隐藏了 很多的复杂。 OK,先看框架的目录。 -------------------------------------------华丽的分割线------------------------------------------------------------ MVC架构的文件目录 public/ -------js/ -------css/ -------img/ index.php .htaccess app/ -------controller/ -------model/ -------view/ library/ bootstrap.php, controller.class.php, model.class.php, template.class.php, mysql.class.php, arist.php // 启动文件, 核心的基类文件,数据库类 config/ config.php // 配置文件 tmp/ .htaccess -------------------------------------------华丽的分割线------------------------------------------------------------ public/index.php 是我们的单入口文件 所有请求都转移到这里分发给不同的控制器,其他都是资源文件; app/ 是我们的 MVC架构 library/ 是我们的 主要类文件和 一些核心文件 config/ 存放配置文件 tmp/ 存放临时文件 包括log session upload -------------------------------------------华丽的分割线------------------------------------------------------------ url 分发 (邮件的收集与分发) index.php <?php //定义框架路径 define('DS', DIRECTORY_SEPARATOR); define('SYSTEM', dirname(dirname(__FILE__))); //获得url参数 $url = isset($_GET['url']) ? $_GET['url']: ''; //加载启动文件 require_once (SYSTEM . DS . 'library' . DS . 'bootstrap.php'); 收集了这些url (信件)后, 我们就需要对他们进行处理. 钩子函数
View Code
function Hook() { global $url; // 定义url 的数组 $urlArr = array(); // 分割url 得到url的数组 $urlArr = explode("/",$url); if(!empty($urlArr)){ $controller = array_shift($urlArr); // 得到控制器 $action = array_shift($urlArr); // 得到指令 $stringParameter = $urlArr; // 得到指令参数 $controllerName = $controller; // 得到控制器的名称 $controller = ucwords($controller).'Controller'; $model = trim($controller); // 加载Model // 初始化控制器 $dispatch = new $controller($model,$controllerName,$action); // 判断控制器方法是否存在 if ((int)method_exists($controller, $action)) { // 调用控制器的方法,将参数传递进去 call_user_func_array(array($dispatch,$action),$stringParameter); } else { //不存在该方法的处理 } }else{ // 显示首页 } }
这里有一个关键函数 call_user_func_array(array($dispatch, $action), $stringParameter) 这个函数会调用 $dispatch对象 的 $action 方法,同时以$stringParameter 作为传入参数。简单表达就是 $dispatch->$action($stringParameter); -------------------------------------------华丽的分割线------------------------------------------------------------ libraray/controller.class.php 这个是我们的核心基类,还是基本阶段,没有扩展很多方法; <?php class controller{ protected $_model; protected $_controller; // 用于后面加载相应的模板 protected $_action; protected $_template;
-------------------------------------------华丽的分割线------------------------------------------------------------ 启动文件中有一个 __autoload() 的魔术方法 加载了 所有 library/ 和 app/ 里的类。 所以只需要 $object = new Class(); 就能创建对象。 所有 MVC框架里的 controller 都会继承这个类 以及它的方法;比如当 url 为 http://yoursite.com/mail/send/132921 首先会 分发这个 url, 即 controller = "mail", action = "send", stringParameter =['132921']; 然后初始化这个控制器 $dispatch = new MailController($DB, "mail", '132921'); 然后判断这个对象是否具有该方法 method_exists("MailController", "send"); 最后回调这个方法 call_user_func_array(array($dispatch,'send'),array('132921')); class MailController extends Controller{ function send($id){ } }
-------------------------------------------华丽的分割线------------------------------------------------------------
|
2022-08-17
2022-11-06
2022-08-17
2022-07-29
2022-07-18
请发表评论