`
xuebingnanmm
  • 浏览: 174419 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

理解PHP中的MVC编程之控制器

    博客分类:
  • PHP
阅读更多

简单来讲,控制器的作用就是接受请求。它使用获取的方法,在这里是通过URI,载入一个功能模块来刷新或者提交一个表述层。控制器将使用$_GET自动全局变量来判断载入哪一个模块。

一个请求的例子,看起来像这样:

http://example.com/index.php?module=login

这看起来很简单,但是在实现的过程中却不是。这里是几个控制器能识别的argument部分:

module定义了使用哪一个模块,如users模块
class定义了使用哪一个功能类,如你想让用户login还是logout
event定义了使用哪一个具体事件

这样一个更复杂的例子可以解释上面的各个argument最终组成的请求URL:

http://example.com/index.php?module=users&class=login

这段请求告诉控制器应该载入users模块,然后是login类,最后因为没有定义具体事件,所以运行login::__default()默认事件。

以下是具体代码部分:

 

<?php
 /**
*index.php
*
*@authorJoeStump<joe@joestump.net>
*@copyrightJoeStump<joe@joestump.net>
*@licensehttp://www.opensource.org/licenses/gpl-license.php
*@packageFramework
 */

 require_once('config.php');

 //{{{__autoload($class)
 /**
*__autoload
*
*AutoloadisranbyPHPwhenitcan'tfindaclassitistryingtoload.
*Bynamingourclassesintelligentlyweshouldbeabletoloadmostclasses
*dynamically.
*
*@authorJoeStump<joe@joestump.net>
*@paramstring$classClassnamewe'retryingtoload
*@returnvoid
*@packageFramework
 */

 function__autoload($class)
 {
$file=str_replace('_','/',substr($class,2)).'.php';
require_once(FR_BASE_PATH.'/includes/'.$file);
 }
 //}}}

 if(isset($_GET['module'])){
$module=$_GET['module'];
if(isset($_GET['event'])){
 $event=$_GET['event'];
}else{
 $event='__default';
}

 if(isset($_GET['class'])){
$class=$_GET['class'];
 }else{
$class=$module;
 }

 $classFile=FR_BASE_PATH.'/modules/'.$module.'/'.$class.'.php';
 if(file_exists($classFile)){
require_once($classFile);
if(class_exists($class)){
 try{
$instance=new$class();
if(!FR_Module::isValid($instance)){
 die("Requestedmoduleisnotavalidframeworkmodule!");
}

$instance->moduleName=$module;
if($instance->authenticate()){
 try{
$result=$instance->$event();
if(!PEAR::isError($result)){
 $presenter=FR_Presenter::factory($instance->presenter,$instance);

if(!PEAR::isError($presenter)){
 $presenter->display();
}else{
 die($presenter->getMessage());
}
 }
}catch(Exception$error){
 die($error->getMessage());
}
 }else{
die("Youdonothaveaccesstotherequestedpage!");
 }
}catch(Exception$error){
 die($error->getMessage());
}
 }else{
die("Anvalidmoduleforyourrequestwasnotfound");
 }
 }else{
die("Couldnotfind:$classFile");
 }
 }else{
die("Avalidmodulewasnotspecified");
}

?>
接下来是以上代码具体的注释:

载入“config.php”

定义__autoload()函数。这是PHP5里面的一个新函数,方便动态地载入各个类。

如果一个argument被定义,那么载入相关的模块、类和具体事件

接下来就是一些判断以及错误的具体操作

最后一切无误后就载入表述层

【友好URL】

如果你觉得上面例子讲到的请求URL让你觉得不舒服的话,那么就用mod_rewrite来实现友好URL吧。接下来是作者给这个框架写的实际重写标准代码:

 

RewriteEngineOn

#ChangetheURIheretowhateveryouwantyourhomepagetobe

RewriteRule^/$/index.php?module=welcome[L,QSA]

#Changes/index.php?module=welcometo/welcome

RewriteCond%{DOCUMENT_ROOT}/%{REQUEST_FILENAME}!-d

RewriteCond%{DOCUMENT_ROOT}/%{REQUEST_FILENAME}!-f

RewriteRule^/([^/]*)$/index.php?module=$1[L,QSA]

#Changes/index.php?module=users&class=loginto/users/login

RewriteCond%{DOCUMENT_ROOT}/%{REQUEST_FILENAME}!-d

RewriteCond%{DOCUMENT_ROOT}/%{REQUEST_FILENAME}!-f

RewriteRule^/([^/]*)/([^/]*)$/index.php?module=$1&class=$2[L,QSA]

#Changes/index.php?module=users&class=login&event=foo

#to/users/login/foo.html

RewriteCond%{DOCUMENT_ROOT}/%{REQUEST_FILENAME}!-d

RewriteCond%{DOCUMENT_ROOT}/%{REQUEST_FILENAME}!-f

RewriteRule^/([^/]*)/([^/]*)/([^/]*).html$\

/index.php?module=$1&class=$2&event=$3[L,QSA]

ExtendingtheController
【扩展控制器】

拥有一个集中控制器的一点好处就是你加入一些功能后,马上就能通过控制器体现出来。以下是几个可以扩展一下这个控制器的点子,使这个框架的整体能力更加强大:
 
你可以使用PHP5里一个新东西SoapServer来自动检测一个请求是否为SOAP

你可以使用控制器来过滤所有的自动全局变量如$_GET和$_POST以防止恶意HTML代码等

你可以使用控制器即时地转换表述层,比如从默认的方式转到PDF方式

你可以直接在控制器中加入缓存机制,这样的好处是应用程序整体都能使用到缓存以提高效率

当然,需要注意一点的是,你在控制器中所增加的功能将体现在程序全局。如你想过滤所有的自动全局变量,但是很多应用程序的管理员需要使用到一些HTML代码,反而成为一件棘手的事情(译者注:本人的想法是可以加一个if条件语句,在加载特定模块时不应用过滤功能即可)。

分享到:
评论

相关推荐

    贯彻PHP中的MVC之控制器

    下面我们将详细探讨控制器在PHP MVC架构中的角色和实现方式。 首先,控制器的主要职责是接收来自用户的HTTP请求,通常这些请求包含了URI(统一资源标识符)。在PHP中,控制器会解析URI以确定需要执行哪个模块、类...

    phpMVC框架编程

    在PHP MVC框架中,通常会有一个中央控制器(如`index.php`),它负责接收用户的所有请求。控制器根据请求参数加载相应的模型和视图,执行相应的业务逻辑,并最终呈现给用户。 例如,一个典型的请求路径可能是这样的...

    PHP MVC

    PHP MVC是将PHP与MVC设计模式相结合的一种编程方式。MVC分为三个主要部分: 1. **Model(模型)**:负责处理业务逻辑和数据操作,通常与数据库交互,管理应用程序的数据。 2. **View(视图)**:负责显示用户界面...

    php中mvc源码项目

    通过这个PHP雇员系统开发项目,你可以学习到如何有效地组织代码,理解MVC模式的工作原理,以及如何在实际项目中应用这些概念。这不仅有助于提升你的PHP编程技能,也有助于你适应其他基于MVC的Web开发框架。

    调度中间件管道代替laminas mvc中的控制器.zip

    总之,调度中间件管道在Laminas MVC中的应用是对传统控制器模式的一种现代化改进,它提供了更好的可扩展性和灵活性,有助于构建更高效、更模块化的PHP应用程序。通过熟练掌握中间件的使用,开发者可以提升代码质量,...

    php面向对象加MVC编程架构

    **MVC编程架构** Model-View-Controller(MVC)是一种软件设计模式,常用于Web应用程序,将业务逻辑、数据和用户界面分离,使得各部分可以独立开发和维护。 - 模型(Model):负责处理业务逻辑和数据操作,与...

    PHP__单入口MVC模式实例

    - `MyMVC`:这个目录很可能是整个MVC框架的根目录,包含了模型、视图、控制器以及其他必要的文件和配置。 - `config`:配置文件通常包含数据库连接信息、路由设置等,用于设置应用的运行环境。 - `model`:存放模型...

    php简易MVC框架

    控制器中的方法对应着不同的URL请求,每个方法处理一种特定的用户操作。 **六、Apode子文件** "Apode"可能是这个框架的一个组件或者模块,具体功能需要查看源代码才能了解。它可能是对某种功能的封装,如用户认证、...

    PHP mvc框架

    在IT行业中,PHP是一种广泛应用的服务器端...这将有助于你更好地理解现有的PHP MVC框架,并在未来的工作中更高效地使用它们。通过实践,你还能学习到如何组织代码,遵循最佳实践,以及如何设计可扩展和可维护的系统。

    【ASP.NET编程知识】ASP.NET MVC从视图传参到控制器的几种形式.docx

    在视图中,可以使用JavaScript的ajax方法将数组传递到控制器中。例如: ```javascript $(function () { var value = ["C#", "JAVA", "PHP"]; $("input[type='button']").click(function () { $.ajax({ url: "/...

    php5的mvc实现

    **PHP5的MVC实现详解** 在Web开发领域,Model-View-Controller(MVC)设计模式是一种广泛应用的架构模式,它将业务逻辑、数据处理和...对于初学者而言,理解MVC模式并运用到实际项目中,是提升编程技能的重要一步。

    PHPmvc框架项目

    本项目“PHPmvc框架”旨在提供一个自定义的、基于Model-View-Controller(模型-视图-控制器)设计模式的PHP框架,以简化开发流程并提高代码组织性。 首先,我们来详细了解一下MVC模式。MVC是一种软件设计模式,它将...

    php MVC 源码,仅供大家学习

    控制器中的方法会根据URL路由来响应用户的请求,组织业务流程。 **4. MVC的优势** - **解耦合**:MVC模式使得代码结构清晰,模型关注数据处理,视图专注于显示,控制器协调两者,降低组件间的耦合度。 - **可维护性...

    本教程以PHP语言为基础,深入浅出地解析MVC(模型-视图-控制器)框架的关键技术,帮助初学者快速掌握并应用于实际的网站开发中

    本教程是一份最简洁易懂的PHP MVC框架入门教程,它详细介绍了MVC(模型-视图-控制器)框架的基本概念和使用方法。内容包括如何设置和使用路由、如何创建和使用控制器、如何定义和操作模型等。每个主题都配有详细的...

    PHP入门培训教程PHP MVC框架核心类.pdf

    PHP MVC框架核心类是PHP入门培训教程中的一部分,该教程旨在帮助初学者快速掌握PHP编程语言并学习MVC框架的核心概念。该教程通过实例演示了框架核心类的设计和实现,帮助学习者快速理解MVC框架的核心思想。 ...

    自己手写PHP MVC 框架

    在自己手写PHP MVC框架的过程中,你可以深入理解这一模式的工作原理,提升编程技能。 **模型(Model)**: 模型是应用的核心,负责处理业务逻辑和数据管理。在PHP MVC框架中,模型类通常与数据库交互,执行增删改查...

    PHP+MVC实现的留言板

    MVC模式是一种软件设计模式,它将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。在PHP留言板中: 1. **模型(Model)**:这部分代码主要处理数据的逻辑,包括从数据库读取留言、...

    MVC+PHP小程序

    6. **URL路由**:在MVC框架中,PHP还可以实现URL路由,将URL映射到相应的控制器方法,实现功能的分发。 尽管这个小程序已经实现了基本功能,但还需要优化和改进,比如增加验证码以防止机器人注册,使用HTTPS协议...

    PHP的MVC框架TinyMVC

    模型负责处理数据和业务逻辑,视图负责显示数据,而控制器作为模型和视图之间的桥梁,处理用户输入并协调它们之间的交互。 **TinyMVC框架特点** 1. **轻量级**:TinyMVC设计简洁,占用资源少,适合快速开发小型项目...

Global site tag (gtag.js) - Google Analytics