2011.12.27 - 开发日记 - Crude Framework开发框架

Posted on 2013-02-13 22:06  SnakeHunt2012  阅读(178)  评论(0)    收藏  举报

本文始作于2011年12月27日,刊登于人人网,与2013年2月13日迁移至此

这次老段说我任务完成得不错,我老开心了。。。

 

第一个是请绘制一张Crude Framework处理一个请求的流程图,这个前几天刚做出来就发在日志上了。

第二个是请阅读lib/CPTemplate.class.php的代码,并简述该类的工作原理,我直接阅读了每一行代码,然后分别做了注释。代码如下:

<?php 
 
class CPTemplate 
{ 
    /* 设置$template_dir为全局变量 */ 
    private $template_dir; 
 
    /* 构造函数: 完成对输入$template_dir的格式化 */ 
    function __construct($template_dir = './template/', $compile_dir = './compile/') 
    { 
        /* 删除$template_dir后面多余的字符, 并保证以一个反斜线为结尾 */ 
        $this->template_dir = rtrim($template_dir, '/').'/'; 
    } 
 
    public function fetch($file_name, $data) 
    { 
        /* 如果输入的数据不是数组, 报错 */ 
        if (!is_array($data)) 
            return FALSE; 
 
        /* 让$tpl_file为文件的绝对路径 */ 
        $tpl_file = $this->template_dir.$file_name; 
 
        /* 如果该文件不存在, 报错 */ 
        if (!file_exists($tpl_file)) 
        { 
            return FALSE; 
        } 
 
        /******************************************** 
         * 如果通过了上面两个检测, 就可以执行输出了 * 
         * 他的返回值是引入的HTML源代码             * 
         ********************************************/ 
        return $this->sandbox($tpl_file, $data); 
    } 
 
    /* render:  驱动fetch */ 
    public function render($file_name, $data = array()) 
    { 
        echo $this->fetch($file_name, $data); 
    } 
 
    private function sandbox($file, $data) 
    { 
        /************************************************************  
         * 打开缓冲                                                 * 
         * php 输出东西,会保存在一个 php 维护的内存里              * 
         * 当这个 buffer 满了, php 会自动往 web server 发送这些数据 * 
         ************************************************************/ 
        ob_start(); 
 
        /********************* 
         * 为$file准备好变量 *     
         * 将数组拆成变量    *  
         * 键为变量名        * 
         * 值为变量值        * 
         *********************/ 
        extract($data); 
 
        /* 将$file代码输出 */ 
        include($file); 
 
        /* 缓冲区输出但输出之后不清空缓冲区, 并把内容存入$output */ 
        $output = ob_get_contents(); 
 
        /* 再丢弃缓冲区中的内容 */ 
        ob_clean(); 
 
        /* 返回$file的源代码 */ 
        return $output; 
    } 
};

 

第三个是请阅读core/Dispatcher.class.php的代码,并简述该类的工作原理,也是代码注释给他交上去的:

<?php
class Dispatcher
{
    private $routes;

    /* __construct:  构造函数 */
    public function __construct($routes)
    {
        /* 将局部变量$routes赋给成员$routes */
        $this->routes = $routes;
    }

    public function dispatch($uri)
    {
        global $session, $MSG;

        /* 对route.inc.php中$route的每个正则表达式进行匹配 */
        foreach($this->routes as $pattern => $config)
        {
            /* 如果匹配成功 */
            if(preg_match($pattern, $uri))
            {
                /* 如果ACTION_ROOT . $config[1]存在 */
                if(file_exists($config[1]))
                {
                    /* 如果请求的Action的权限要求不是ROLE_ALL */
                    if(!in_array(ROLE_ALL,$config[2]))
                    {
                        /* 从对话中取出用户的信息存储在$user中 */
                        $user = $session->get('user');

                        /* 如果用户的权限不够 */ 
                        if(!in_array($user['usertype'] , $config[2]))
                        {
                            /* 报错返回 */
                            return $MSG['CODE_NOT_PERMITTED'];
                        }
                    }

                    /* 如果通过了上面的权限检测, 就可以使用Action了 */
                    include_once($config[1]);

                    /* $action_file_name存储所请求的Action的文件名(带后缀) */
                    $action_file_name = basename($config[1]);

                    /* $action_class_name存储所请求的Action的文件名(不带后缀) */
                    $action_class_name = substr($action_file_name, 0, strpos($action_file_name, '.'));

                    /* 如果所请求的Class文件存在 */
                    if(class_exists($action_class_name)){

                        /* 新实例$act, 所请求的Action */
                        $act = new $action_class_name();

                        /* 如果所请求的Action有execute方法 */
                        if(method_exists($act, 'execute')){

                            /* 添加权限认证 */

                            $act->execute(null);
                            /* 返回succeess信息 */
                            return $MSG['CODE_SUCCESS'];
                        }else{
                            /* 返回没有找到 */
                            return $MSG['CODE_NOT_VALID'];
                        }
                    }else{
                        /* 返回没有找到 */
                        return $MSG['CODE_NOT_VALID'];
                    }
                }else{
                    /* 返回没有找到 */
                    return $MSG['CODE_NOT_VALID'];
                }
            }
        }
        /* 返回没有找到 */
        return $MSG['CODE_NOT_FOUND'];
    }
};
?>

 

第四个是请指出至少一个Crude Framework可能存在的问题或者设计不当之处,由于实在是对框架了解太少,说不出什么真正的缺点,就寒暄式的跟他说了:“如果说不足的话,比如我仅请求一个非常简单的页面,但是经过Dispatcher.class.php复杂的处理就不必要了,而且加重了网络传输的负担。”。