资讯专栏INFORMATION COLUMN

自己动手写PHP框架(三)

Terry_Tai / 3540人阅读

摘要:假设我们站点的域名是,用户请求地址。模型层我们可以将数据组织和处理逻辑放在模型层,这里封装了数据库操作,甚至有些大型的框架会在这一层对这个数据库进行对象化,目的都是为了组织和处理数据,然后将处理好的数据返回给控制器层。

作者:Terry Gao

1. 控制器

第一篇我们聊到路由分发会把用户请求按照规则分发到控制器层的不同类,而默认的规则中,请求会下发到控制器的index类的main方法,我们可以在这个方法中处理用户请求,并将处理结果呈现给用户。来看看源码

/* Nova/Application/Controllers/index.php */

很基础,很简单,就是输出一个"Hello World!"。你会说“用户的请求呢?用户的请求体现在哪里?我没看出来啊!”

好吧,我们来稍微复杂一点。假设我们站点的域名是nova.local,用户请求地址:http://nova.local/?act=user&s...。根据Nova的路由规则,act=user意味着它请求的是NovaApplicationControllersuser.php的user类,st=info对应着user::info()方法,用来获取用户信息,而id=1则是user::info需要通过GET接收的一个参数,我们可以在user::info中对id进行解析和处理,获取id为1的用户信息,然后输出给用户。源代码如下:

/* Nova/Application/Controllers/user.php */
getUserInfo($_GET["id"]);
        print_r($userInfo);
    }
}

上面的代码,没什么安全性可言,GET的信息没有任何过滤和校验,由于这个系列文章只是介绍基本的框架思路,所以这部分内容不是我们的重点,请暂且忽略(如果你实在看不下去如此ugly的代码,可以在Github上Fork Nova项目,然后提Pull Request给我)。

在info()方法中,我们新建了一个Modelsuser类,然后调用Modelsuser::getUserInfo()方法,来处理$_GET["id"],并将获取到的用户信息通过print_r()方法打印出来。这里的Modelsuser类就是MVC中M层的一个实现。

2. 模型层

我们可以将数据组织和处理逻辑放在模型层,这里封装了数据库操作,甚至有些大型的框架会在这一层对这个数据库进行对象化,目的都是为了组织和处理数据,然后将处理好的数据返回给控制器层。上一节提到的Modelsuser类就是一个专门用于处理用户数据的模型类,来看看源码:

/* Nova/Application/Models/user.php */
db = PDOMysql::connect()->db;
    }

    /**
     * 根据用户id查询用户信息并返回查询结果
     *
     * @return array
     */
    public function getUserInfo($userId)
    {
        $sql = "select * from user where id=:userId";

        $stmt = $this->db->prepare($sql);
        $params = array(":userId" => $userId);
        $stmt->execute($params);

        return $stmt->fetch();
    }
}

这个类在构造的时候创建了一个数据库连接,然后在getUserInfo()方法中根据传入的用户id查询对应的用户信息,并将查询结果返回给调用者(控制器)。

通过下图来看看到目前为止,我们有什么了

好吧,看出来了,MVC的View没有。View层有一个好东西,也许你听过,甚至你用过,对,就是Smarty,这么好的东西拿来直接用吧。把Smarty的源码下载下来,然后统统解压到Nova/Application/Library/Smarty下面,我们要怎么把Smarty加载进来呢?首先改造一下Controller层,新建一个Controllersbase.php,作为控制器层的基类,在这里我们引入并初始化一下Smarty,代码如下:

/* Nova/Application/Controllers/base.php */
smarty = new Smarty();
        //对smarty做一些基本设置
        //设置模板的存放位置
        $this->smarty->setTemplateDir(APP_DIR."/Views/");
        //smarty编译文件的存储位置
        $this->smarty->setCompileDir(ROOT_DIR."/compiled/");
        //设置smarty配置文件的存放位置
        $this->smarty->setConfigDir(CONFIG_DIR."/smarty/");
        //smarty自带缓存,设置缓存的存储位置
        $this->smarty->setCacheDir(ROOT_DIR."/cache/");
    }
}

然后我们让Controllersuser继承Controllersbase,就可以使用smarty了

/* Nova/Application/Controllers/user.php */
getUserInfo($_GET["id"]);
        
        //将数据传入给smarty
        $this->smarty->assign("user", $userInfo);
        //通过smarty的display函数,调用index.tpl模板来显示数据
        $this->smarty->display("index.tpl");
    }
}

模板代码如下:

/* Nova/Application/View/index.tpl */
User Name: {$user["name"]}
Password: {$user["password"]}

至此,MVC齐全了,整个架子搭起来喽。运行一下试试看吧。
你可以在Github上查看Nova项目的源代码。

如果你有任何问题或建议,可以扫描下方二维码或者微信搜索[phpjiagoushier],关注我的微信公众号[PHP架构],与我交流互动。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22576.html

相关文章

  • 自己动手PHP框架(一)

    摘要:作者作为的入门进阶,自己动手写一个框架可以从各方面巩固和加深你对的理解,还能了解一些架构方面的基础知识。它将程序划分为三层。最上面的一层,是直接面向最终用户的视图层。最底下的一层,是核心的模型层,负责检索组织和处理程序所需的数据或信息。 作者:Terry Gao 作为PHP Coder的入门进阶,自己动手写一个MVC框架可以从各方面巩固和加深你对PHP的理解,还能了解一些架构方面的基础...

    B0B0 评论0 收藏0
  • 自己动手PHP框架(二)

    摘要:作者上一篇提到了类的自动加载和,今天就来逐一说说。为这个问题提供了一个解决方案,这就是类的自动装载机制。为了方便使用自定义的全局,把方法也重写了。 作者:Terry Gao 上一篇提到了类的自动加载和Session,今天就来逐一说说。 1. 类的自动加载 在使用PHP的OO模式开发系统时,通常大家习惯将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也...

    April 评论0 收藏0
  • 后端开发者从零做一个移动应用(后端篇)

    摘要:后端开发的疑惑后端开发最常面对的一个问题性能高并发等等。而到了时代,在方面有了前后端分离概念移动后端更是无力渲染天然前后端分离。 先来上一张前端页面的效果图(Vue + Vux + Vuex + Vue-Router)。showImg(https://segmentfault.com/img/remote/1460000010207850); 第一次做gif 没什么经验,太大了。加载...

    codergarden 评论0 收藏0
  • 从零开始搭建论坛(一):Web服务器与Web框架

    摘要:服务器通过协议与客户端通信,因此也被称为服务器。本文标题为从零开始搭建论坛一服务器与框架本文链接为更多阅读自己动手开发网络服务器一自己动手开发网络服务器二自己动手开发网络服务器三服务器网关接口实现原理分析最佳实践指南应用浅谈框架编程简介 之前用 Django 做过一个小的站点,感觉Django太过笨重,于是就准备换一个比较轻量级的 Web 框架来玩玩。Web.py 作者已经挂掉,项目好...

    dantezhao 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<