[转] MVC with PHP(二)

news/2024/7/7 11:37:37

from: http://www.phpx.com/cma3005.html

MVC with PHP(二)

作者: teacherli [文章出自: www.phpx.com]


MVC with PHP(一)中的bug的问题是存在,最大的问题是日志系统的问题,等完成这这个介绍后我后把全部更正的程序源码打包
出来,这里就暂时不做更改了.
先来看看在application.class.php中是如何建立controller实例的:

PHP代码:--------------------------------------------------------------------------------
/**
    * 执行函数
    *
    * 此类唯一对外的一个接口
    **/
    public function run()
    {
       $this->parsePath();
       $this->checkSecurity($this->module, $this->action);
    1. $controller = new $this->controllerClassName();
    2. $controller->{$this->action}();
       $this->writeLog($this->module, $this->action);
    }

--------------------------------------------------------------------------------

Application这个类在实例后唯一可进行调用的一个函数,它根据用户的URL请求来分析得出所需要的Controller类名,然后实例化这个类(上面标1的地方),再调用从URL中获取的动作名称(上面标2的地方),

这个举一个简单的例子:
URL:
http://localhost/?module=news&action=showList
Application通过分析这个URL重到controllerClassName=news, action=showList,然后它将在包含处理这个controller类的文件名(在Application->getControllerFile()中进行),然后实例化News这个
controller类(标1的地方), 随后调用它的动作showList(标2的地方).
来看看newsController.php中的内容:
=============================================================

PHP代码:--------------------------------------------------------------------------------

        /**
     * FileName: newsController.php
     *  Introduce: 新闻控制类
     *
     * @author: 大师兄
     * @Email: 
teacherli@163.com
     * @version $Id$
     * @copyright 2004-10-26
     **/
    include_once ("./controller/comm/controller.class.php");
    include_once ("./model/news/newsModel.php");
   
    class NewsController extends Controller
    {
        private $model;
       
        /**
        * 构造函数
        *
        **/
        public function __construct()
        {
            parent::__construct();
            $this->model = new NewsModel();
            $this->setSmartyTemplate_dir("./view/news");
        }  
       
        /**
        * 显示新闻列表
        *
        **/
        public function showList()
        {  
           1. $newsList = & $this->model->getList();

           2. $this->smarty->assign("newsList", $newsList);
           3. unset($newsList);

           4. $this->smarty->display("newsList.html");
        }   
    }
    ?>
   
--------------------------------------------------------------------------------

==============================================================
首先,NewsController类继承自公共类Controller,在类进行初始化时产生一个NewsModel类,这个类是一个model类,由这个类负责新闻模块所有的对数据库的交互. parent::__construct()调用父类的构造函数,完成对view的控制类Smarty的初始化.$this->setSmartyTemplate_dir("./view/news")将模板目录定位在./view/news目录.

然后看我们上面的例子,请求URL为http://localhost/?module=news&actio...List,表示要调用
showList这个动作,看NewsController类的showList()成员函数:
1. $newsList = & $this->model->getList(): $this->model在NewsController初始化时建立,这一句要使用$this->model从数据库里提取出一个新闻列表,这个列表当然就是Smarty在操作循环块时需要的二维数组了,在NewsModel类中,它是采用ADODB回传的一个二维数组.
2. $this->smarty->assign("newsList", $newsList): 熟悉吧,smarty中循环块的程序控制
3. unset($newsList):考虑到效率问题,对于这些临时变量在使用完成后即时将它unset。
4. $this->smarty->display("newsList.html"):使用smarty来显示view.

大家看明白了吗?实际上controller类要做的事情就是这样:1.调用model从数据库取出记录 2.操

作Smarty显示view。
再来看看NewsController的父类Controller类的源码:
===========================================================

PHP代码:--------------------------------------------------------------------------------

    /**
     * FileName: controller.class.php
     * Introduce: Base class of controller
     *
     * @author: 李晓军
     * @Email: 
teacherli@163.com
     * @version $Id$
     * @copyright 2004-10-26
     **/

    include_once ("./comm/smarty/Smarty.class.php");
    include_once ("./comm/config.inc.php");

    abstract class Controller
    {
        private $smarty;
   
       /**
        * 系统构建函数
        * 初始化Smarty
        **/
        function __construct()
        {
            $this ->smarty = new Smarty();
       
            $this->smarty->template_dir    =   "./view/templates";
            $this->smarty->compile_dir     =   "./view/templates_c";
            $this->smarty->cache_dir       =   "./view/cache";
            $this->smarty->cache_lifetime  =   60 * 60 * 24;
            $this->smarty->caching         =   false;
            $this->smarty->left_delimiter  =  "<{";
            $this->smarty->right_delimiter =  "}>";
        }
       
        /**
        * 设置smarty模板路径
        *
        * @param string $template
        **/
        public function setSmartyTemplate_dir($template)
        {
            $this->smarty->template_dir = $template;
        }
       
        /**
        * 设置smarty是否进行缓存
        *
        * @param boolean $cache
        **/
        public function setSmartyCache($cache = false)
        {
            $this->smarty->cache = $cache;
        }
       
        /**
        * 设置smarty缓存时间
        *
        * @param string $cacheLifetime
        **/
        public function setSmartyCacheTime($cacheLifetime)
        {
            $this->smarty->cache_lifetime = $cacheLifetime;
        }
       
        /**
        * 动作被执行后一个短暂的提示
        *
        * @param string $module 重新定向到的模块名称
        * @param string $action 重新定向的动作名称
        * @param string $params 参数名称
        * @param string $message 提示信息
        **/
        public function redirect($module, $action, $params="", $message="动作已经被成功执

行")
        {
            $time = WAIT_FOR_TIME;
            $params = ("" == $params) ? "" : "&$params";
            $URL = "?module=" . $module . "&action=" . $action . $params;
           
            //重新定Smarty模板目录至公用目录
            $this->setSmartyTemplate_dir("./view/templates");
            $this->smarty->assign("URL", $URL); //重定向的目录
            $this->smarty->assign("message", $message); //提示信息
            $this->smarty->assign("time", $time);
            $this->smarty->display("wait.html");
        }
       
       /**
        * 调用本类不存在的方法时进行的处理
        *
        * @param string $name
        * @param string $parameter
        **/
        public function __call($name, $parameter)
        {
            throw new ActionNotAllowException("对不起,你所请求的动作 $name 没有定义

...
");
        }
       
        /**
        * 析构函数
        *
        **/
        public function __destruct()
        {
            unset($this->smarty);
        }
    }
?>

--------------------------------------------------------------------------------

==============================================
Controller是一个抽象类,也就是说它不可以直接使用new 来产生一个实例对象,在类的构造函数里产生一个Smarty类,并对其进行基本的设置。其它的几个函数是对Smarty对象进行设置的成员函数, 这里来看看这两个函数:

public function redirect($module, $action, $params="", $message="动作已经被成功执行"):
这是一个重新定向成员函数,它的作用是当我们对模块进行一些操作后给出的提示页面,然后经过设置好的时间自动重新定向到另一个位置,例如我们要对新闻进行一些删除,删除成功后我们要给用户返回这样一个页面,告诉用户操作已经成功,请待n秒后自动返回....这在论坛中是很常见的,这里我也引用了这样的策略。

public function __call($name, $parameter):
当类调用类没有声明的函数时使用这个函数进行处理,这可是个好东东,有了它,可以使用对程序

的控制更加简单了,大家可以试试这个方法....

好了,Controller 部分就谈到这里了。


happyBot自动摘抄自喜悦村精华帖,查看原帖获得完整内容:

http://www.phpx.com/happy/top92561.html





http://www.niftyadmin.cn/n/3652119.html

相关文章

Apache之AWStats分析系统

AWStats 分析系统 AWStats 是使用Perl 语言开发的一款开源日志分析系统&#xff0c;它用来完成自动化的日志统计与分析工作。 1、将安装AWStats 所需软件包传到/opt目录下 awstats-7.6.tar.gz2、安装 AWStats 软件包 cd /opt tar zxvf awstats-7.6.tar.gz mv /opt/awstats-…

phpGACL-- 基于PHP的通用访问控制列表 [中文手册]

phpGACL --- Generic Access Control Lists with PHP 基于PHP的通用访问控制列表phpGACL是一组允许你控制对象&#xff08;用户&#xff0c;远程主机等&#xff09;访问其他对象&#xff08;网页&#xff0c;数据库等&#xff09;权限的函数。该组函数可以通过简单的管理提供高…

Apache日志分割

一、Apache日志分割 使用Apache 自带 rotatelogs 分割工具&#xff0c;将 Apache 的日志进行按每天的日期自动分割。 vim /usr/local/httpd/conf/httpd.conf --275行--修改 ErrorLog "| /usr/local/bin/rotatelogs -l /var/log/httpd/error_%Y%m%d.log 86400" #分割…

Apache网页优化概述

内容概要Apache网页优化概述1、gzip介绍作用2、Apache的压缩模块3、mod_ gzip 模块与mod_ deflate 模块Apache网页优化概述 在企业中&#xff0c;部署Apache后只采用默认的配置参数&#xff0c;会引发网站很多问题&#xff0c;换言之默认配置是针对以前较低的服务器配置的&…

[转]MVC with PHP(一)

MVC with PHP 实践(一)作者:大师兄MVC是什么?MVC是一种设计模式,将一个应用程序分为三个部分Model(模型),View(视图), Controller(控制器),在程序中各自负责处理自己的任务.SUN公司在JSP中将它发挥的淋漓尽致,尤其在structk中,它采用JSP来做View,severlet来做Controller,Bean做…

Apache网页压缩

操作步骤一、检查是否安装了mod_deflate模块二、如果没有安装mod_deflate模块&#xff0c;就要重新编译安装Apache添加mod_deflate模块三、配置mod_deflate模块启用四、检查安装&#xff0c;重启服务五、测试mod_deflate压缩是否生效一、检查是否安装了mod_deflate模块 apache…

[转] 如何用正确的方法来写出质量好的软件的75条体会

1. 你们的项目组使用源代码管理工具了么&#xff1f;应该用。VSS、CVS、PVCS、ClearCase、CCC/Harvest、FireFly都可以。我的选择是VSS。2. 你们的项目组使用缺陷管理系统了么&#xff1f;应该用。ClearQuest太复杂&#xff0c;我的推荐是BugZilla。 3. 你们的测试组还在用Word…

php开发中实用的两条sql

这两天项目开发中,需要实现一些比较实用的功能&#xff0c;用了两个使用的sql&#xff0c;总结一下&#xff0c;怕下次忘记了。1. 检索数据库中跟提交的内容相匹配的内容比如&#xff1a;提交的数据是“游泳”&#xff0c;那么数据库中有“我喜欢游泳”字样的就算是匹配&#x…