php路由与控制器分析_第1页
php路由与控制器分析_第2页
php路由与控制器分析_第3页
php路由与控制器分析_第4页
php路由与控制器分析_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、php路由与控制器分析路由是指分组从源到目的地时,决定端到端路径的网络范围的进程。下面是分享的php路由与控制器分析,一起来看一下吧。我们为什么要使用路由?原因1:一个更漂亮的URI1 .URI的改进刚刚开始学PHP寸,我们一定写过blog.php?id=1之类的URI,使用GET式获取参数。这样的URI有两个缺点,一是容易被SQL注射攻击,二是维护性可读性差,大家可以比较下面两种URI哪一种更具备可读性。.xxxxxx./blog.php?id=1上面URI是我们初学PHPt常用的。.xxxxxx./blog/1这种URI是目前最流行的URI,举个例子,比如很多读书类,电影类网站,都使用了这

2、样的URI,这才的URI要比index.php?a=1&b=2&c=3&d=4要简洁很多。2 .实现方法在WEB®目的根目录下写一个.htaess文件RewriteEngineOnRewriteRuleA(a-zA-Z0-9/*)$index.php/$1重写规则,让域名后面的字符串直接做为一个参数传入index.php,这样index.php就成为了你整个WE戚用的中心,定义了“请求和响应的映射”。原因2:单一入口机制的易维护性1. 路由数组一个PHPW学者,刚开始做项目,项目做着做着规模做大了,常常这个PHP页面给另一个PHP页面用GET法传值,有时传的值

3、还不止一个,时间一久,你的WE颐目,N个PHP页面宛如一个复杂的蜘蛛网,让你难以维护。一旦有修改,会涉及很多PH浅件,工作量很大。MVC的单一入口机制可以解决维护难的问题,路由就是一套映射,可以让你一个URI对应一个方法。$route=''=>'IndexControllerIndex','blog'=>'BlogControllerShow','blog/id/name'=>'BlogControllerShow',;2. 获取参数$path=$_SERVER'PATH_

4、INFO'$path=ltrim($path,'/');echo$path.PHP_EOL;我们在浏览器里输入:.mysite./blog/1后,path变量为/blog/1。使用ltrim函数删除左边的斜杠,然后使用explode把字符串拆解成数组。$path_arr=explode('/',$path);核心代码如下:if(isset($_SERVER'PATH_INFO')$path=$_SERVER'PATH_INFO'$path=ltrim($path,'/');$path_arr=explode

5、('/',$path);if(isset($path_arr0)$key=$path_arr0;unset($path_arr0);else$key=''if(isset($path_arr1)$parameters=array_values($path_arr);if(isset($route$key)$arr=explode('',$route$key);$controller=new$arr0;$action=$arr1;if(isset($parameters)$controller->$action($parameters);el

6、se$controller->$action();elserequire'error.html.php'unset函数可以销毁数组中key和value,但是并不会重建索引,所以path_arr0是要调用的控制器类和方法名,path_arr1或者path_arr1.N就作为传入方法的参数。重定向和错误页面是WE朦统中最常见的,如果不用路由机制,你可能要没完没了的重复写重定向或者错误页面的显示或者跳转代码,有了路由,只需要一句话就可以完成。原因3:减少资源的消耗MVC采用了控制器(controller)来响应请求(request),每次请求来时,应该在指定的一个PH我件中初始

7、化这个控制器,而不是分别在不同的PH浅件中做初始化工作,这样可以减少资源的消耗是不是一定要用控制器?方案1:不用控制器我们现在路由数组里添加一项,value不是一个字符串,而是一个匿名函数(Closure)$route=''=>'Index','blog'=>'BlogControllerShow','blog/id/name'=>'BlogControllerShow','f'=>function()echo'hello'这里的routef是

8、一个匿名函数,并不是一个控制器类的方法,所以,我们要把上一节路由代码做一下修改:if(isset($route$key)if($route$keyinstanceofClosure)$route$key();else$arr=explode('',$route$key);$controller=new$arr0;$action=$arr1;if(isset($parameters)$controller->$action($parameters);else$controller->$action();elserequire'error.html.php

9、9;方案2:使用控制器每一次都require一个html页面是一件很不优雅的事情,所以我们写一个render函数functionrender($path,array$args)extract($args);require($path);我们知道每个URI对应了一个方法,但是我们常常遇到这样的问题:<?phpclassControllerpublicfunction_call($method,$args)echo'hasnotthisfunction'.$method;classIndexControllerextendsControllerpublicfunctionIn

10、dex()echo_CLASS_;for($i=1;$i<=20;+$i)$data$i='content'render('template.html.php','data'=>$data);classBlogControllerextendsControllerpublicfunctionShow()echo_CLASS_;for($i=1;$i<=10;+$i)$data$i='blog'render('template.html.php','data'=>$data);?>用不用控制器,取决于你的业务复杂度。个人建议使用控制器,但是对于业务很简单的页面跳转或检查,可以直接写在一个匿名函数里。控制器里写些什么?我们也许写过这样的代码:classIndexControllerextendsControllerpublicfunctionIndex($content)return''.$content.'这样把界面的代码嵌入的写法是非常难以维护的,也是很多开发人员(包括我)最厌恶的写法,因为这种写法并没有做好

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论