1.4.3 应用(前端控制器)(1)

1.4.3 应用(前端控制器)(1)

作者:刘琨 2017-11-23 17:27:35

云计算 《Yii框架深度剖析》第1章初识PHP框架技术,本章首先介绍PHP语言发展历史及其适合的应用领域,然后讲解PHP框架技术的概念并仿照Yii框架源码自定义一个框架,其中包括MVC框架模式、单入口模式和应用(前端控制器模式)的实现。读者在充分了解了这部分内容后,将正式进入到Yii框架的学习。本节为大家介绍应用(前端控制器)。

1.4.3 应用(前端控制器)(1)

1.4.2节中对原有的MVC模式进行了改进,在入口文件中实现了URL的解析。用户的每一次请求都指向服务器的***可访问文件。经过解析URL,最终转向所要访问的控制器。但是当系统日趋复杂和多样时,如URL参数和POST数据需要进行必要的检查和特殊字符过滤、记录日志、访问统计等,如果各种可以集中处理的任务都放在入口文件执行,那么将会出现代码重复、业务逻辑混乱且分散的情况。因此,为了降低系统代码逻辑的复杂度,进一步集中控制系统,并提高系统的安全控制能力,以及可维护性、可重用性和可伸缩性,本节中对原有的MVC模式进行了改进,提出了应用(前端控制器)的概念,实现MVC在复杂系统中的前端控制器开发模式优化策略。

1.在应用中实现URL解析

采用前端控制器模式,提供一个处理不同请求的中心,处理工作包括安全事务、视图选择、异常处理和响应内容的生成,通过将这些处理工作集中在一点进行,大大降低了PHP代码量,同时也减少了视图层的程序逻辑,保证了在不同请求之间可以大量地重用逻辑代码。

应用(前端控制器)的URL解析功能在文件framework/Cweb- Application.php文件中实现,流程图如图1-9所示。解析URL代码如下。
 

 

  1. php 
  2. class CWebApplication {  
  3. public $name;  
  4. //默认控制器是SiteController  
  5. public $defaultController="site";  
  6. //默认动作是actionIndex  
  7. public $defaultAction="index";  
  8. //执行应用  
  9. public function run()  
  10. {  
  11. //如URL 为http://hostname/index.php?r=controllerid/actionid  
  12. //得到controllerid/actionid  
  13. if(!empty($_GET['r']))  
  14. {  
  15. $route=$_GET['r'];  
  16. //得到controllerid 赋值给成员变量  
  17. $pos=strpos($route,'/');  
  18. $this->defaultController=substr($route,0,$pos);  
  19. $this->defaultController=strtolower($this->defaultController);  
  20. //得到actionid 赋值给成员变量  
  21. $this->defaultAction=(string)substr($route,$pos+1);  
  22. }  
  23. //得到控制器类名  
  24. $className=ucfirst($this->defaultController).'Controller';  
  25. //获得控制器文件路径  
  26. $classFile="./protected/controllers/".$className.'.php';  
  27. //最后一步操作:该类文件存在及该类存在,则导入并调用acion 方法  
  28. if(is_file($classFile))  
  29. {  
  30. if(!class_exists($className,false))  
  31. {  
  32. require($classFile);  
  33. $classnew $className();  
  34. $functionName="action".ucfirst($this->defaultAction);  
  35. $class->$functionName();  
  36. }  
  37. }  
  38. }  

2.单例模式创建应用(前端控制器设计模式)

对于系统中的某些类来说,只有一个实例很重要。例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。例如,在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行***化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此,确保系统中某个对象的***性(即一个类只能有一个实例)是非常重要的。

我们希望系统中的应用(前端控制器)只有一个实例对象而且该实例对象易于外界访问,从而方便应用实例对象个数的控制并节约系统资源,单例模式是最好的解决方案之一。

单例模式是一种常用的软件设计模式。其要点有3个:一是类只能有一个实例,二是它必须自行创建这个实例,三是它必须自行向整个系统提供这个实例。

从具体实现角度来说,就是以下3点:一是单例模式的类只提供私有的构造方法,二是类定义中含有一个该类的静态私有对象,三是该类提供静态的公有方法用于创建或获取它本身的静态私有对象。在framework/CWebApplication.php文件中添加下面所示的部分代码。
 

  1. php 
  2. class CWebApplication {  
  3. ……  
  4. //定义类的静态私有对象  
  5. private static $_app;  
  6. //构造方法在实例对象被创建时自动执行  
  7. private function __construct($config=null)  
  8. {  
  9. //获取配置文件中的数组  
  10. }  
  11. //静态的公有方法用于创建它本身的静态私有对象  
  12. public static function createApplication($config=null)  
  13. {  
  14. if(self::$_app===null)  
  15. self::$_app = new CApplication($config);  
  16. return self::$_app;  
  17. }  
  18. //静态的公有方法用于获取它本身的静态私有对象  
  19. public static function app()  
  20. {  
  21. return self::$_app;  
  22. }  
  23. //执行应用  
  24. public function run(){……}  

3.应用的配置文件

默认情况下,应用是一个CWebApplication的实例。要自定义它,通常需要提供一个配置文件以在创建应用实例时初始化其属性值。这就好比去组装计算机,客户拿来具体的配置单,按照要求就可以组装符合要求的计算机。而CWebApplication就是组装工人,配置单就是下面要说明的配置文件。

配置信息在配置文件中以数组元素的方式存放,一个元素就是两个字符串组成的键值对,一个字符串是键(key),另一个字符串是这个键的对应的值(value)。大多数的系统都有一些配置常量,将这些常量放在配置文件中,系统通过访问这个配置文件取得配置常量,就可以通过修改配置文件而无须修改程序达到更改系统配置的目的。系统也可以在配置文件中存储一些工作环境信息,这样在系统每次访问时,这些信息可以运行在每一个应用的生命周期中。

通常在一个单独的PHP 脚本(protected/config/main.php)中保存这些配置。在脚本中,通过以下方式返回此配置数组。
 

  1. php 
  2. return array(  
  3. //默认控制器  
  4. "defaultController"=>"default",  
  5. //通过应用全局访问方法Yii::app()->name;直接访问。  
  6. "name"=>"my application",  
  7. );  
  8. ?> 

 在应用的构造方法中添加对配置文件操作的代码:
 

  1. php 
  2. class CWebApplication {  
  3. ……  
  4. //构造方法在实例对象被创建时自动执行  
  5. private function __construct($config=null)  
  6. {  
  7. //获取配置文件中的数组  
  8. if(is_string($config))  
  9. $config=require($config);  
  10. /*  
  11. 把配置文件中数组定义的元素赋值给CWebApplication 类中相同成员属性  
  12. array(  
  13. "name"=>"my application",  
  14. "defaultController"=>"default",  
  15. );  
  16. */  
  17. if(is_array($config))  
  18. {  
  19. /*  
  20. 第一次循环:$this->name=“my application”;  
  21. 第二次循环:$this->defaultController=“default”;  
  22. */  
  23. foreach($config as $key=>$value)  
  24. $this->$key=$value;  
  25. }  
  26. }  
  27. ……  

 

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/245142.html<

(0)
运维的头像运维
上一篇2025-04-26 01:29
下一篇 2025-04-26 01:30

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注