文档章节

PHP框架开发第一步——工厂模式

crazymus
 crazymus
发布于 2015/10/26 13:18
字数 437
阅读 260
收藏 3

几乎所有的PHP框架都使用单入口文件方式,也就是说所有的请求都是从index.php进入。那就必须要用到工厂模式来实现请求的分发。

例如,我们在请求这样的URL :

http://www.test.com/index.php?c=User&a=index



含义是我们需要请求User控制器的index方法。也就是说index.php需要根据参数去创建User控制器的实例,并调用index方法。它好像就是实现了一个“工厂”的功能。

我们可以这样实现一个工厂类:

class Factory{
	
	public static function getInstance($controller_name,$action_name){
		
		if(class_exists($controller_name)){
			
			$controller = new $controller_name;
			
			if(method_exists($controller,$action_name)){
				
				$controller->$action_name();
			}else{
				
				exit('action not found');
			}
		}else{
			
			exit('controller not found');
		}	
	}
	
}



有了这个工厂类,我们在index.php中只需要编写下面的代码,就可以完成全部的逻辑了:

$controller_name = $_GET['c'];
$action_name = $_GET['a'];

Factory::getInstance($controller_name,$action_name);



分析一下上面的代码,首先接收到控制器名称和方法名称,传递给工厂类Factory的getInstance方法。Factory会自动帮我们实例化控制器,并调用相应的方法。

这就是工厂类,给他一定的参数,它能帮你做剩下的工作。

再来看看工厂类是怎么实现的。它首先会检查控制器类是否存在:

class_exists($controller_name);



如果类不存在,会提示:controller not found.

然后会创建控制器的实例,再检查方法是否存在并执行。

method_exists($controller,$action_name);



这就是工厂类的实现原理,当然还可以继续完善它。

在更多的情况下,我们会把控制器放在独立的文件中,这时候工厂类需要先引入控制器文件:

require('app/controller/'.$controller_name.'.php');




© 著作权归作者所有

crazymus

crazymus

粉丝 71
博文 80
码字总数 111033
作品 8
武汉
后端工程师
私信 提问
《JavaScript设计模式与开发实践》最全知识点汇总大全

系列文章: 《JavaScript设计模式与开发实践》基础篇(1)—— this、call 和 apply 《JavaScript设计模式与开发实践》基础篇(2)—— 闭包和高阶函数 《JavaScript设计模式与开发实践》模式...

嗨呀豆豆呢
01/04
0
0
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0
Java 设计模式(14) —— 复合模式

一、复合模式 模式常一起使用,组合在一个设计解决方案中 复合模式在一个解决方案中结合两个或多个模式,能解决一般性或一系列的问题 二、示例 本次设计模式讲解中无代码示例,由于复合模式是...

磊_lei
2018/05/26
0
0
编程中的那些套路——关于单例模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 在设计模式中,单例模式和工厂模式)可以说是使用的最普遍的设计模式了,所以掌握此种模式尤为重要。 单...

gzchen
2018/08/27
0
0
编程中的那些套路——关于策略模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 今天讲讲策略模式,策略模式 和工厂模式十分相像(或者说在代码逻辑层面,他们是一样的)。 但策略模式与...

gzchen
2018/08/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PCB设计-Allegro软件入门系列-allegro环境变量和快捷键

Allegro作为一款高速PCB设计的EDA软件,有完善的约束规则设计和信号完整性电源完整性仿真等各种专业工具深受电子行业从业者喜爱。 对于该软件来说,电子从业者接触最多的就是Allegro的画板功...

demyar
9分钟前
1
0
腾讯云存储

1、进入腾讯云平台,创建 2、进入配置查看域名 3、查看KEY参数 4、将2、3中的参数录入到cms后台 然后点测试按钮查看情况

迅睿CMS-PHP开源CMS程序
11分钟前
1
0
ES 6.x 版本 待验证的CURL命令查询操作

1. 查询数据 curl -H "Content-Type: application/json" -XGET http://elastic:123456@127.0.0.1:9200/alias1/_search -d '{"query": {"match_all": {}}}' 2. 添加数据 如果有不指定ID可以自......

coord
18分钟前
1
0
如何写好论文摘要:研究人员不得不知的小秘诀

我们为何要写摘要? 它的目的为何? 简而言之,摘要的目的就是简单的讨论这篇文章让读者更容易的了解这篇文。 它能在读者与作者之间搭起一条桥梁。当您搜索信息时,您无法一下阅读整篇文章,...

论文辅导员
21分钟前
1
0
移动端、PC端(前后台)、小程序常用的UI框架

移动端、PC端(前后台)、小程序常用的UI框架 1.移动端UI库 ①.Vant UI 官方地址:https://youzan.github.io/vant/#/zh-CN/intro github地址:https://github.com/youzan/vant 优点:用来做移...

jason_kiss
21分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部