zoukankan      html  css  js  c++  java
  • 终于写了个自己的简单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参数。

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

  • 相关阅读:
    Hexo yilia 主题启用及相关设置
    Hexo Next 主题启用及相关设置
    值得一用的 Windows 软件清单
    ES6新特性2
    ES6新特性1
    手写promise第三天
    手写promise第一天
    Generator异步函数
    函子Functor
    柯里化函数组合的学习
  • 原文地址:https://www.cnblogs.com/arist/p/2857209.html
Copyright © 2011-2022 走看看