终于写了个自己的简单MVC框架!

+--------------------------------------------------------+
 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.控制器调用数据,并使用模版渲染输出内容。

一些代码说明:

View Code
 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/

http://localhost/aristblog/hello/test/2

 我只添加了一个控制器hello, 有个test方法,接收一个ID参数。

我的下一步,是使用这个框架来写一个简单博客程序,并使用一些设计模式。

 

posted @ 2013-01-11 23:29  小言s  阅读(700)  评论(2编辑  收藏  举报