搜索
首页后端开发php教程MVCwithPHP(二)_PHP

MVCwithPHP(二)_PHP

Jun 01, 2016 pm 12:40 PM
functionpublic函数这个

MVC

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 部分就谈到这里了。

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
您如何防止与会议有关的跨站点脚本(XSS)攻击?您如何防止与会议有关的跨站点脚本(XSS)攻击?Apr 23, 2025 am 12:16 AM

要保护应用免受与会话相关的XSS攻击,需采取以下措施:1.设置HttpOnly和Secure标志保护会话cookie。2.对所有用户输入进行输出编码。3.实施内容安全策略(CSP)限制脚本来源。通过这些策略,可以有效防护会话相关的XSS攻击,确保用户数据安全。

您如何优化PHP会话性能?您如何优化PHP会话性能?Apr 23, 2025 am 12:13 AM

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显着提升应用在高并发环境下的效率。

什么是session.gc_maxlifetime配置设置?什么是session.gc_maxlifetime配置设置?Apr 23, 2025 am 12:10 AM

thesession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceIsiseededeedeedeedeedeedeedto to to avoidperformance andununununununexpectedLogOgouts.3)

您如何在PHP中配置会话名?您如何在PHP中配置会话名?Apr 23, 2025 am 12:08 AM

在PHP中,可以使用session_name()函数配置会话名称。具体步骤如下:1.使用session_name()函数设置会话名称,例如session_name("my_session")。2.在设置会话名称后,调用session_start()启动会话。配置会话名称可以避免多应用间的会话数据冲突,并增强安全性,但需注意会话名称的唯一性、安全性、长度和设置时机。

您应该多久再生一次会话ID?您应该多久再生一次会话ID?Apr 23, 2025 am 12:03 AM

会话ID应在登录时、敏感操作前和每30分钟定期重新生成。1.登录时重新生成会话ID可防会话固定攻击。2.敏感操作前重新生成提高安全性。3.定期重新生成降低长期利用风险,但需权衡用户体验。

如何在PHP中设置会话cookie参数?如何在PHP中设置会话cookie参数?Apr 22, 2025 pm 05:33 PM

在PHP中设置会话cookie参数可以通过session_set_cookie_params()函数实现。1)使用该函数设置参数,如过期时间、路径、域名、安全标志等;2)调用session_start()使参数生效;3)根据需求动态调整参数,如用户登录状态;4)注意设置secure和httponly标志以提升安全性。

在PHP中使用会议的主要目的是什么?在PHP中使用会议的主要目的是什么?Apr 22, 2025 pm 05:25 PM

在PHP中使用会话的主要目的是维护用户在不同页面之间的状态。1)会话通过session_start()函数启动,创建唯一会话ID并存储在用户cookie中。2)会话数据保存在服务器上,允许在不同请求间传递数据,如登录状态和购物车内容。

您如何在子域中分享会议?您如何在子域中分享会议?Apr 22, 2025 pm 05:21 PM

如何在子域名间共享会话?通过设置通用域名的会话cookie实现。1.在服务器端设置会话cookie的域为.example.com。2.选择合适的会话存储方式,如内存、数据库或分布式缓存。3.通过cookie传递会话ID,服务器根据ID检索和更新会话数据。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版