您好,欢迎访问一九零五行业门户网

一步步编写PHP的Framework(十)

之前讲了这么多,实际上都只是为框架搭建了一个架子而已,框架里面还没有什么东西, 从今天开始,我就开始从controller,model,view这几块儿来分别介绍一下。
ps:之前的很多内容我都没有细讲,就比如路由,真正的框架路由肯定不是通过get方式指定的,而是正则,并且它需要兼容多个server,多种方式。
我们知道所有的请求都需要经过控制器,所以首先还是说一下控制器。
我们之前已经 说过控制器的概念了,但是这个控制器还是功能太弱了,因为它只是从功能上是控制器,框架并没有为它做任何事情,框架实际上可以实现一些常用的功能,然后用户定义的控制器继承它,这样用户可以少写很多代码的。
之前的控制器是:
1 2 class indexcontroller {
3     public function index() {
4         echo 'hello world';
5     }
6 }
现在假设框架已经实现了控制器的一些基本功能,这个类我们称为controller.php,那么现在代码就变成了:
1 _redirect(array(
2         'action' => 'test',
3         'controller' => 'test',
4         'param1' => '1'
5 ));
它代表的意思是跳转到test这个控制器的test这个action,并且还传递了一个参数,这个参数名为param1,值为1。
01 protected function _redirect(array $arr) {
02         $controller= empty($_get['c']) ? c('defaultcontroller') : trim($_get['c']); //设置了默认的控制器
03         $action= empty($_get['a']) ? c('defaultaction') : trim($_get['a']); //设置了默认的action
04         array_key_exists('controller',$arr)  $arr['controller'] = $controller;
05         array_key_exists('action',$arr)  $arr['action'] = $action;
06         $str = '/?';
07         foreach($arr as $key => $val) {
08             if(!is_int($key)) {
09                 $str .= ($key . '=' . $val . '&');
10             }
11         }
12         $str = substr($str,0,strlen($str) - 1);
13         response::redirect($str);
14     }
这个就是我刚刚手写的跳转代码,实际上就是把传递的数组拼接一下然后组成一个字符串,这个字符串就可以看成是一个url,由于现在没有对route.php进行更多的处理,对于localhost/demo2/index.php?controller=a这种url它跳转就会出错,暂时只支持localhost/index.php?controller=a这种url,还有$controller和$action的获取和route.php中的代码重复了,这些都需要在后面真正实现路由的时候再讲解,暂时就这么看看吧,虽然我自己都感觉这样的代码很恶心。
可能大家都注意到了,当这个函数拼接到url之后,是直接调用了response的redirect方法,这是为什么呢?
第一:有可能在真正应用中,我们直接在控制器中调用$this->_redirect满足不了我们的需求,这个时候我们就需要直接调用response::redirect,比如跳转到百度首页就只能调用response::redirect(http://www.baidu.com);
第二:从逻辑上,跳转是一个服务器对客户端的响应,所以需要写在response中,具体的可参照java。
那么我们又必须新建一个response.php这样一个文件:
01 $action();
14             } else {
15                 //时间有限,不写逻辑了
16             }
17         } else {
18             if(class_exists($controller)) {
19                 $class = new $controller();
20                 if(method_exists($class,$action)) {
21                     $class->$action();
22                 } else {
23                     //时间有限,不写了
24                 }
25             } else {
26                 //时间有限,不写了
27             }
28         }
29     }
实际上逻辑上就是判定一下要调用的action是否属于本控制器,如果是本控制器,直接调用$this->$action()即可,否则,需要实例化这个控制器,即$class = new $controller(),然后再调用这个action。
本来以为半个小时就可以写完,结果写了一个小时了,由于时间超出我的预算,所以代码都是手写的,不知道有不有什么语法错误什么的,反正看看思路就ok了。
其它类似信息

推荐信息