+--------------------------------------------------------+
MVC DESIGN PATTERN
@author arist
@time 2013/1/4
@qq 240382473
@email arist1213@yahoo.com
@version smvc 1.0
@description: 简单的MVC框架,用来学习设计模式的尝试。
+--------------------------------------------------------+
+---------+
| 目录结构 |
+---------+
MVC/
|---- application
|---- frontend // 前台mvc目录
|---- controller
|---- model
|---- view
|---- backend // 后台mvc目录
|---- controller
|---- model
|---- view
|---- config // 配置目录
|---- resource // 资源目录
|---- images
|---- js
|---- style
|---- system // 系统目录
|---- temp
|---- .htaccess // 重写url
|---- index.php // 入口文件
+---------+
| 基本原理 |
+---------+
1..htaccess 文件通过 apache rewrite 将所有的请求发送到 index.php...详情请见:http://www.cnblogs.com/arist/archive/2012/05/20/2510687.html
2.index.php 加载启动文件 MVC/system/init.php
3.Application::run() 位于 MVC/system/application.php
4.$param = explode('/', $_GET['url']);
5.获得参数数组, 解析第一个参数为控制器$c,第二个参数为控制器的方法$action。剩余的为参数$param。
6.加载相应的控制器和模型文件。
7.调用控制器的方法 call_user_func_array(array($c,$action), $param);
8.控制器调用数据,并使用模版渲染输出内容。
一些代码说明:
1 <?php 2 /** 3 这个类解析了URL, 引用了相应的类, 使用 call_user_func_array() 来动态调用类及方法,并传入参数。 4 可能我这个解析器还需要优化来适应不同的异常情况,还有安全问题需要解决。但基本原理就是如此简单。 5 6 MVC/system/init.php 这个文件加载了一些资源文件,包括控制器和模型的基类,还有模板类和配置文件。 7 定义了一些路径常量。 8 */ 9 final class Application 10 { 11 static public function run() 12 { 13 if (isset($_GET['url'])) 14 { 15 $param = explode('/', $_GET['url']); 16 //print_r($param);exit; 17 $controller = array_shift($param); 18 $action = array_shift($param); 19 20 //echo $controller . ' '.$action;exit; 21 22 $controller_file = CONTROLLER_PATH.$controller.'.php'; 23 24 $model_file = MODEL_PATH.$controller.'.model.php'; 25 if (file_exists($model_file)) {require $model_file;} 26 27 if (file_exists($controller_file)) { 28 require $controller_file; 29 $c = new $controller; 30 if (method_exists($c, $action)) { 31 32 call_user_func_array(array($c,$action), $param); 33 34 } else { 35 echo 'action not exists in class'; 36 } 37 } else { 38 echo 'class not exists'; 39 } 40 } 41 else 42 { 43 require CONTROLLER_PATH.'index.php'; 44 $controller = new index(); 45 $controller->home(); 46 } 47 } 48 }
todo:
1.对$param的数据没有做过滤及安全处理。
2.对参数解析的做细分异常处理,设置默认的路由参数。
3.控制器获取多个模型实例
4.重写模版类,目前使用ecshop的模板类。
可以使用断点调式代码.
+---------+
| 命名规范 |
+---------+
统一采用驼峰命名. getId, getNumber
控制器 文件 如: index.php, hello.php
控制器类名同文件名相同.
控制器的方法采用驼峰命名: getArticleById() getAll()
模型文件 如 : indexMode.php, helloModel.php
模型类名同文件名相同.
模版文件名称与同控制器相同
测试URL:
http://localhost/aristblog/hello/test/2
我只添加了一个控制器hello, 有个test方法,接收一个ID参数。
我的下一步,是使用这个框架来写一个简单博客程序,并使用一些设计模式。