简单来讲,控制器的作用就是接受请求。它使用获取的方法,在这里是通过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架构中的角色和实现方式。 首先,控制器的主要职责是接收来自用户的HTTP请求,通常这些请求包含了URI(统一资源标识符)。在PHP中,控制器会解析URI以确定需要执行哪个模块、类...
在PHP MVC框架中,通常会有一个中央控制器(如`index.php`),它负责接收用户的所有请求。控制器根据请求参数加载相应的模型和视图,执行相应的业务逻辑,并最终呈现给用户。 例如,一个典型的请求路径可能是这样的...
PHP MVC是将PHP与MVC设计模式相结合的一种编程方式。MVC分为三个主要部分: 1. **Model(模型)**:负责处理业务逻辑和数据操作,通常与数据库交互,管理应用程序的数据。 2. **View(视图)**:负责显示用户界面...
通过这个PHP雇员系统开发项目,你可以学习到如何有效地组织代码,理解MVC模式的工作原理,以及如何在实际项目中应用这些概念。这不仅有助于提升你的PHP编程技能,也有助于你适应其他基于MVC的Web开发框架。
总之,调度中间件管道在Laminas MVC中的应用是对传统控制器模式的一种现代化改进,它提供了更好的可扩展性和灵活性,有助于构建更高效、更模块化的PHP应用程序。通过熟练掌握中间件的使用,开发者可以提升代码质量,...
**MVC编程架构** Model-View-Controller(MVC)是一种软件设计模式,常用于Web应用程序,将业务逻辑、数据和用户界面分离,使得各部分可以独立开发和维护。 - 模型(Model):负责处理业务逻辑和数据操作,与...
- `MyMVC`:这个目录很可能是整个MVC框架的根目录,包含了模型、视图、控制器以及其他必要的文件和配置。 - `config`:配置文件通常包含数据库连接信息、路由设置等,用于设置应用的运行环境。 - `model`:存放模型...
控制器中的方法对应着不同的URL请求,每个方法处理一种特定的用户操作。 **六、Apode子文件** "Apode"可能是这个框架的一个组件或者模块,具体功能需要查看源代码才能了解。它可能是对某种功能的封装,如用户认证、...
在IT行业中,PHP是一种广泛应用的服务器端...这将有助于你更好地理解现有的PHP MVC框架,并在未来的工作中更高效地使用它们。通过实践,你还能学习到如何组织代码,遵循最佳实践,以及如何设计可扩展和可维护的系统。
在视图中,可以使用JavaScript的ajax方法将数组传递到控制器中。例如: ```javascript $(function () { var value = ["C#", "JAVA", "PHP"]; $("input[type='button']").click(function () { $.ajax({ url: "/...
**PHP5的MVC实现详解** 在Web开发领域,Model-View-Controller(MVC)设计模式是一种广泛应用的架构模式,它将业务逻辑、数据处理和...对于初学者而言,理解MVC模式并运用到实际项目中,是提升编程技能的重要一步。
本项目“PHPmvc框架”旨在提供一个自定义的、基于Model-View-Controller(模型-视图-控制器)设计模式的PHP框架,以简化开发流程并提高代码组织性。 首先,我们来详细了解一下MVC模式。MVC是一种软件设计模式,它将...
控制器中的方法会根据URL路由来响应用户的请求,组织业务流程。 **4. MVC的优势** - **解耦合**:MVC模式使得代码结构清晰,模型关注数据处理,视图专注于显示,控制器协调两者,降低组件间的耦合度。 - **可维护性...
本教程是一份最简洁易懂的PHP MVC框架入门教程,它详细介绍了MVC(模型-视图-控制器)框架的基本概念和使用方法。内容包括如何设置和使用路由、如何创建和使用控制器、如何定义和操作模型等。每个主题都配有详细的...
PHP MVC框架核心类是PHP入门培训教程中的一部分,该教程旨在帮助初学者快速掌握PHP编程语言并学习MVC框架的核心概念。该教程通过实例演示了框架核心类的设计和实现,帮助学习者快速理解MVC框架的核心思想。 ...
在自己手写PHP MVC框架的过程中,你可以深入理解这一模式的工作原理,提升编程技能。 **模型(Model)**: 模型是应用的核心,负责处理业务逻辑和数据管理。在PHP MVC框架中,模型类通常与数据库交互,执行增删改查...
MVC模式是一种软件设计模式,它将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。在PHP留言板中: 1. **模型(Model)**:这部分代码主要处理数据的逻辑,包括从数据库读取留言、...
6. **URL路由**:在MVC框架中,PHP还可以实现URL路由,将URL映射到相应的控制器方法,实现功能的分发。 尽管这个小程序已经实现了基本功能,但还需要优化和改进,比如增加验证码以防止机器人注册,使用HTTPS协议...
模型负责处理数据和业务逻辑,视图负责显示数据,而控制器作为模型和视图之间的桥梁,处理用户输入并协调它们之间的交互。 **TinyMVC框架特点** 1. **轻量级**:TinyMVC设计简洁,占用资源少,适合快速开发小型项目...