Zendframework 的前端控制器到底是如何进行工作的?

由于之前只学习了一个星期的zf,只停留在简单的使用上,对机制的理解还不够透彻。今天想仿照ZF新建一个简单的MVC框架,算是对自己先前一段时间的总结,也是为了更加深入的了解ZF,毕竟zf够强大。

废话不多说,首先配置虚拟机,配置好虚拟机后,设置rewrite机制,几经波折,完成了。参考zf的index.php,开始写。毕竟自己是菜鸟,所以写的不太好。

首先配置好环境变量。当遇到font控制器实例化的时候出现问题了,我提取了URi之后并且加载了相关的控制器,如何实例化控制器成了一个问题。上网百度了下关于font的相关介绍。

zendframework的工作流程

那么url所请求的控制器是如何实例化的?font是通过什么方式实现的?这就是我所关心的问题。

fontcontroller采用的是单例模式,关于这一知识点,总结如下:

单例模式的特点:一个类只有一个实例,并且通过getinstance自行创立,必须向整个系统提供这个实例(这个还有点不太明白,zendframework里面font控制器说明这一点,more example?)于是我把自己的font类改为单例模式:

 1 <?php
 2 /*
 3  * font用来完成URL请求的分配
 4  * 这里学习了单例模式的基本格式以及概念
 5  * 
 6  * */
 7 class Font
 8 {
 9     static private $_instance=NULL;
10     private function __construct(){
11         
12     }
13     
14     private function __clone(){
15         
16     }
17     static public function getInstance(){
18         if(is_null(self::$_instance)||!isset(self::$_instance)){
19             self::$_instance=new self();
20         }
21         return self::$_instance;
22     }
23     
24     public function disPatch(){
25     echo 'OK';
26     }
27     
28     
29     
30     
31 }

经过测试,成功,但是,还是没有解决关于类和方法的实例化问题。几经思索,突然想起了上学期看到的《PHP模式框架与测试》里面关于映射的概念。google了一下,应用如下

 1 public function disPatch(){
 2         $url=$_SERVER["REQUEST_URI"];
 3          $pattern='/\//';
 4          $array=preg_split($pattern, $url);
 5          $controller=$array[1].'Controller';
 6          $action=$array[2].'Action';
 7         include PATH.'/controller/'.$controller.'.php';
 8          $conclass=new ReflectionClass($controller);
 9          $act=$conclass->getMethod($action);
10          $con=$conclass->newInstance();
11          $act->invoke($con);  
12     }

测试ok

原文地址:https://www.cnblogs.com/phplover/p/2967023.html