当前位置: 简表范文网 > 专题范文 > 公文范文 >

php路由与控制器分析(范文推荐)

| 来源:网友投稿

路由是指分组从源到目的地时,决定端到端路径的网络范围的进程。下面是小编分享的php路由与控制器分析,一起来看一下吧。我们为什么要使用路由?原因1:一个更漂亮的URI1.URI的改进下面是小编为大家整理的php路由与控制器分析(范文推荐),供大家参考。

php路由与控制器分析(范文推荐)

  路由是指分组从源到目的地时,决定端到端路径的网络范围的进程。下面是小编分享的php路由与控制器分析,一起来看一下吧。

    我们为什么要使用路由?

  原因1:一个更漂亮的URI

  1.URI的改进

  刚刚开始学PHP时,我们一定写过blog.php?id=1之类的URI,使用GET方式获取参数。这样的URI有两个缺点,一是容易被SQL注射攻击,二是维护性可读性差,大家可以比较下面两种URI哪一种更具备可读性。

  www.xxxxxx.com/blog.php?id=1

  上面URI是我们初学PHP最常用的。

  www.xxxxxx.com/blog/1

  这种URI是目前最流行的URI,举个例子,比如很多读书类,电影类网站,都使用了这样的URI,这样的URI要比index.php?a=1&b=2&c=3&d=4....要简洁很多。

  2.实现方法

  在WEB项目的根目录下写一个.htaccess文件

  RewriteEngine On

  RewriteRule ^[a-zA-Z0-9/]*$ index.php/$1

  重写规则,让域名后面的字符串直接做为一个参数传入index.php,这样index.php就成为了你整个WEB应用的中心,定义了“请求和响应的映射”。

  原因2:单一入口机制的易维护性

  1.路由数组

  一个PHP初学者,刚开始做项目,项目做着做着规模做大了,常常这个PHP页面给另一个PHP页面用GET方法传值,有时传的值还不止一个,时间一久,你的WEB项目,N个PHP页面宛如一个复杂的蜘蛛网,让你难以维护。一旦有修改,会涉及很多PHP文件,工作量很大。

  MVC的单一入口机制可以解决维护难的问题,路由就是一套映射,可以让你一个URI对应一个方法。

  $route=[

  ''=>'IndexController@Index',

  'blog'=>'BlogController@Show',

  'blog/id/name'=>'BlogController@Show',

  ];

  2.获取参数

  $path=$_SERVER['PATH_INFO'];

  $path=ltrim$path,'/';

  echo $path.PHP_EOL;

  我们在浏览器里输入:www.mysite.com/blog/1后,path变量为/blog/1。使用ltrim函数删除左边的斜杠,然后使用explode把字符串拆解成数组。

  $path_arr=explode'/', $path;

  核心代码如下:

  ifisset$_SERVER['PATH_INFO']

  $path=$_SERVER['PATH_INFO'];

  $path=ltrim$path,'/';

  $path_arr=explode'/', $path;

  ifisset$path_arr[0]

  $key=$path_arr[0];

  unset$path_arr[0];

  else

  $key='';

  ifisset$path_arr[1]

  $parameters=array_values$path_arr;

  ifisset$route[$key]

  $arr=explode'@', $route[$key];

  $controller=new $arr[0];

  $action=$arr[1];

  ifisset$parameters

  $controller->$action$parameters;

  else

  $controller->$action;

  else

  require 'error.html.php';

  unset函数可以销毁数组中key和value,但是并不会重建索引,所以path_arr[0]是要调用的控制器类和方法名,path_arr[1]或者path_arr[1..N]就作为传入方法的参数。

  重定向和错误页面是WEB系统中最常见的,如果不用路由机制,你可能要没完没了的重复写重定向或者错误页面的显示或者跳转代码,有了路由,只需要一句话就可以完成。

  原因3:减少资源的消耗

  MVC采用了控制器(controller)来响应请求(request),每次请求来时,应该在指定的一个PHP文件中初始化这个控制器,而不是分别在不同的PHP文件中做初始化工作,这样可以减少资源的消耗。

    是不是一定要用控制器?

  方案1:不用控制器

  我们现在路由数组里添加一项,value不是一个字符串,而是一个匿名函数(Closure)

  $route=[

  ''=>'Index',

  'blog'=>'BlogController@Show',

  'blog/id/name'=>'BlogController@Show',

  'f'=>functionecho 'hello';

  ];

  这里的route[f]是一个匿名函数,并不是一个控制器类的方法,所以,我们要把上一节路由代码做一下修改:

  ifisset$route[$key]

  if$route[$key] instanceof Closure

  $route[$key];

  else

  $arr=explode'@', $route[$key];

  $controller=new $arr[0];

  $action=$arr[1];

  ifisset$parameters

  $controller->$action$parameters;

  else

  $controller->$action;

  else

  require 'error.html.php';

  方案2:使用控制器

  每一次都require一个html页面是一件很不优雅的事情,所以我们写一个render函数

  function render$path,array $args

  extract$args;

  require$path;

  我们知道每个URI对应了一个方法,但是我们常常遇到这样的问题:

  <?php

  class Controller

  public function __call$method,$args

  echo 'has not this function'.$method;

  class IndexController extends Controller

  public function Index

  echo __CLASS__;

  for$i=1;$i<=20;++$i

  $data[$i]='content';

  render'template.html.php',['data'=>$data];

  class BlogController extends Controller

  public function Show

  echo __CLASS__;

  for$i=1;$i<=10;++$i

  $data[$i]='blog';

  render'template.html.php',['data'=>$data];

  ?>

  用不用控制器,取决于你的业务复杂度。个人建议使用控制器,但是对于业务很简单的页面跳转或检查,可以直接写在一个匿名函数里。

  控制器里写些什么?

  我们也许写过这样的代码:

  class IndexController extends Controller

  public function Index$content

  return '<html><head></head><body>'.$content.'</body></html>';

  这样把界面的代码嵌入的写法是非常难以维护的,也是很多开发人员(包括我)最厌恶的写法,因为这种写法并没有做好界面与业务逻辑的分离,所以我们需要使用视图。

  <html>

  <head>

  </head>

  <body>

  <?php foreach$data as $key=>$value ?>

  <p>

  <?php echo $key.':'.$value; ?>

  </p>

  <?php ?>

  </body>

  </html>

  每一次调用控制器的某个方法时,render函数都会把参数以关联数组的形式传入,做到“业务逻辑”和“表现”的浅层次分离,但是这种分离还不是最好的,因为前端开发人员仍然需要面对甚至处理PHP代码,后端开发人员也有和前端人员沟通的成本,所以后面某一节,会再谈一种更好的分离方式。

相关推荐

热门文章

关于河流污染演讲稿合集(完整)

最近发表了一篇名为《关于河流污染的演讲稿》的范文,感觉很有用处,重新编辑了一下发到。演讲稿具有逻辑严密,态度明确,观点鲜明的特点。在不断进步的时代,能够利用到演讲稿的场合越来越多,在写之前,可以先参考范文。下面是小编为大家整理的关于河流的演讲稿,希望能够帮助到大家!关于河流污

2022年度大学生个人实习报告最新(完整文档)

最近发表了一篇名为《2022年大学生个人实习报告最新》的范文,觉得有用就收藏了,希望大家能有所收获。使大学生增加社会阅历,积累经验。社会阅历和工作经验是职业场中的决定因素。只有参加实习,通过实习的检验,才能积累自身的阅历和经验。小编在这给大家带来2022年大学生个人实习报告最新,欢迎大

2022教学工作会议演讲稿(全文完整)

《教学工作会议演讲稿》是一篇好的范文,觉得应该跟大家分享,希望大家能有所收获。演讲稿是人们在工作和社会生活中经常使用的一种文体。它可以用来交流思想,感情,表达主张,见解。也可以用来介绍自己的学习,工作情况和经验等等。下面是小编为大家整理的工作会议演讲稿,希望能够帮助到大家!教学工作会议演讲稿1各位:

优秀大学生实习报告【完整版】

最近发表了一篇名为《优秀大学生实习报告2022精选》的范文,好的范文应该跟大家分享,看完如果觉得有帮助请记得(CTRL+D)收藏本页。能拓展大学生的综合素质,培养适应型人才。实习是大学生拓展自身素质的主要载体之一,那么关于一份好的实习报告要怎么写?以下是小编为大家准备了优秀大学生实习报告2

2022年度集体荣誉感演讲稿大全【优秀范文】

本页是最新发布的《集体荣誉感演讲稿大全》的详细范文参考文章,感觉写的不错,希望对您有帮助,希望大家能有所收获。演讲稿是人们在工作和社会生活中经常使用的一种文体。它可以用来交流思想、感情,表达自己的主张、看法;也可以用来介绍自己的学习、工作情况和经验……下面是小编为大家整理的荣誉感演讲稿大全

三下乡社会实践报告最新

《2022三下乡社会实践报告最新》是一篇好的范文,好的范文应该跟大家分享,为了方便大家的阅读。随着个人的文明素养不断提升,报告的使用成为日常生活的常态,通常情况下,报告的内容含量大、篇幅较长,那么下面给分享关于2022报告最新,欢迎阅读!三下乡社会实践报告【篇1】20__年8月,队(新城区三分队)在

2022年度清明节感怀演讲稿【完整版】

本页是最新发布的《2022清明节感怀演讲稿》的详细范文参考文章,好的范文应该跟大家分享,重新编辑了一下发到。4月4日,是我国的传统节日:清明节,让怀着无比沉重和景仰的心情来缅怀革命,继承革命传统。你知道么,今天小编整理了清明节感怀演讲稿供大家参考,一起来看看吧!清明节感怀演讲稿一

小学生寒假安全教育家长心得3篇通用

本页是最新发布的《小学生寒假安全教育家长心得3篇通用》的详细范文参考文章,好的范文应该跟大家分享,这里给大家转摘到。是生命之本,安全是头等财富!我们每个人都应该重视自己安全。写一篇安全心得能让自己在安全教育过后的总结中得到许多的收获。你是否在找正准备撰写“小寒假安全教育家长心得”

五四青年节青春演讲稿

《五四青年节青春演讲稿2022》是一篇好的范文,觉得有用就收藏了,重新编辑了一下发到。青年们还要集中进行各种社会志愿和社会实践活动,还有许多地方在青年节期间举行****仪式。五四的核心内容为,进步,民主,科学。以下是小编为大家准备了五四青年节演讲稿2022范本,欢迎参阅。五四青年节青春演讲

2022大学自我鉴定毕业生登记表不足之处10篇(精选文档)

《大学自我鉴定毕业生登记表不足之处精选10篇》是一篇好的范文,感觉写的不错,希望对您有帮助,为了方便大家的阅读。对于刚刚毕业的生,写好一份自我鉴定也是进入岗位的开始,但刚毕业的大学生如何写好自我鉴定呢?下面是小编给大家带来的大学自我鉴定毕业生登记表不足之处精选10篇,欢迎大家阅读参考,我们一起来看看

梦想从这里起航演讲稿10分钟左右(全文完整)

本页是最新发布的《梦想从这里起航演讲稿10分钟左右》的详细范文参考文章,感觉很有用处,为了方便大家的阅读。是什么?是人们在梦里所大胆的想象,是美好的期望,它不一定会实现。那既然有可能实现不了,为什么还要人们拼命去实现呢?因为梦想的美好在于实现它的过程。下面是小编为大家整理的梦想从这里起航演

五四精神演讲稿

本页是最新发布的《2022五四精神演讲稿》的详细范文参考文章,感觉很有用处,这里给大家转摘到。演讲稿也叫演讲词,它是在较为隆重的仪式上和某些公众场合发表的讲话文稿。演讲稿是进行演讲的依据,是对演讲内容和形式的规范和提示,它体现着演讲的目的和手段。以下是小编整理的2022五四演讲稿