|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
对于PHP的语法结构,刚开始真的很不习惯,真搞不懂为什么每个变量之前都要加个“$”符号,每个语句写完之后都必须加上“分号”来表示此句已经结束,还有,PHP对字母的大小写是敏感的,写的时候一定要注意大小写的区别。
之前讲了这么多,实践上都只是为框架搭建了一个架子罢了,框架外面还没有甚么器材, 从明天入手下手,我就入手下手从Controller,Model,View这几块儿来分离引见一下。
PS:之前的良多内容我都没有细讲,就好比路由,真实的框架路由一定不是经由过程GET体例指定的,而是正则,而且它需求兼容多个Server,多种体例。
咱们晓得一切的恳求都需求经由掌握器,所以起首仍是说一下掌握器。
咱们之前已 说过掌握器的概念了,然而这个掌握器仍是功效太弱了,由于它只是从功效上是掌握器,框架并没无为它做任何工作,框架实践上可以完成一些经常使用的功效,然后用户界说的掌握器承继它,如许用户可以少写良多代码的。
之前的掌握器是:
1 <?php 2 class IndexController { 3 public function index() { 4 echo 'Hello world'; 5 } 6 } 如今假定框架已完成了掌握器的一些根基功效,这个类咱们称为Controller.php,那末如今代码就酿成了:
1 <?php 2 class IndexController extends Controller { 3 public function index() { 4 echo 'Hello world'; 5 } 6 } 如许做有甚么优点呢,因为Controller承继了Base,所以IndexController也具有了Base的功效,如许就不需求用户再编写良多捕捉的代码等。
固然,如许做也出缺点,测试IndexController的时分对照费事。
明天我先说一下掌握器对照基本的两个功效,跳转和转发。
起首是跳转,这个用的太广泛了,好比用户登录的时分,点击登录按钮,进入后台处置的页面,处置终了以后就需求跳转,那末怎样完成跳转呢?
有几种体例:
第一种:<script>location.href = "XXXX";</script>在JS中完成跳转;
第二种:header("Location:url");详细利用可检查PHP手册;
第三种:在HTML的meta中设置refresh;
因为header挪用的时分假如之前页面已有输入,跳转会生效,所以需求联合meta的refresh一同利用,固然,你也能够直接利用JS的这类体例来完成,只是我不太喜好这类体例,由于我之前利用这类体例完成跳转的时分出干预干与题。
如今咱们界说跳转这个函数的名字为_redirect,为何后面加上_呢,这也是我的一个习气,关于函数,只需不是public,我都利用_作为前缀。能够人人会问了,为何不设置这个函数为public呢,由于用户编写的掌握器也只会承继它而不会直接挪用,所以我设置成了protected。
1 protected function _redirect(Array $arr) { 2 3 4 }
临时可以将功效弄得弱一点,假定跳转的参数经由过程数组传递过去,那末咱们可使用类型提醒(Array $arr)这类体例来弄定,假如传递的参数不是数组,那末直接会报错。
咱们利用的体例可所以如许:
1 $this->_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.百度.com");
第二:从逻辑上,跳转是一个办事器对客户真个呼应,所以需求写在Response中,详细的可参照Java。
那末咱们又必需新建一个Response.php如许一个文件:
01 <?php 02 class Response extends Base { 03 public static function redirect($url) { 04 if(is_string($url)) { 05 if(!headers_sent()) { 06 header("Location:" . $url); 07 exit(); 08 } else { 09 $str = '<meta http-equiv="Refresh" contect="0;url='.$url.'">'; 10 exit($str); 11 } 12 } else { 13 //毛病处置 14 } 15 } 16 } 这里的逻辑对照复杂,实践上就是剖断是不是有输入,没有输入那末就直接利用header("Location")停止跳转,假如有输入,那末利用meta的refresh跳转。
注重:实践上还可以在这个跳转上开辟更多的功效,然而因为我只是也许讲一下,所以更多的内容就不写了,有乐趣的人可以去Toper下面看看。
如许,一个对照复杂的跳转就完成了,那末怎样完成转发呢?
可以复杂如许了解,转发实践上就是再挪用了一下某一个Controller的某一个Action。
所以如许咱们就能够对照复杂的完成转发了:
01 protected function _forward(Array $arr) { 02 $controller= empty($_GET['c']) ? C('defaultController') : trim($_GET['c']); //设置了默许的掌握器 03 $action= empty($_GET['a']) ? C('defaultAction') : trim($_GET['a']); //设置了默许的Action 04 if(array_key_exists('controller',$arr)) { 05 $controller = $arr['controller']; 06 } 07 if(array_key_exists('action',$arr)) { 08 $action = $arr['action']; 09 } 10 $controller .= 'Controller'; 11 if($controller === get_class()) { 12 if(method_exists($this,$action)) { 13 $this->$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了。
终于学会把表单的数据插入数据库,然后显示出来了,应该说一个程序的雏形已经诞生了。 |
|