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

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代码,后端开发人员也有和前端人员沟通的成本,所以后面某一节,会再谈一种更好的分离方式。

相关推荐

热门文章

防自然灾害安全教育心得7篇通用【完整版】

本页是最新发布的《防自然灾害安全教育心得7篇通用》的详细范文参考文章,觉得有用就收藏了,为了方便大家的阅读。教育能让更新了观念,改善了思想,了解了当前的社会形式。你在安全教育中一定有意想不到的收获,写一篇安全教育心得回顾一下吧。你是否在找正准备撰写“防自然灾害安全教育心得”,下面小编收集了

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

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

2022年70年周年校庆演讲稿最新范本(精选文档)

《70年周年校庆演讲稿最新范文》是一篇好的范文,觉得有用就收藏了,希望大家能有所收获。演讲稿的最终目的是用于讲话,所以,它是有声语言,是书面化的口语。它一方面是把口头语言变为书面语言,即化声音为文字,起到规范文字、有助演讲的作用。下面是小编为大家整理的70年演讲稿最新范文,希望能够帮助到大家!70年

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

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

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

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

五四青年节青春演讲稿

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

2022最新青年担当演讲稿(全文完整)

《最新青年担当演讲稿》是一篇好的范文,感觉很有用处,这里给大家转摘到。沧海,无人愿甘沦平庸,无人愿在茫茫粟漠中归依。青年们,当在光华中,勇披战衣,秉承之责任心,书写高昂之战歌。下面是小编为大家整理的最新青年担当演讲稿,希望能够帮助到大家!最新青年担当演讲稿1敬爱的老师,亲爱的同学:大家好!

2022年度清明节主题学生作文500字合集

《2022清明节主题学生作文500字》是一篇好的范文,觉得应该跟大家分享,这里给大家转摘到。这来之不易的幸福生活是革命用自己的鲜血换来的,作为一名青年志愿者,一定不辜负烈士们的遗愿,让我们踏着烈士们的足迹奋勇向前!下面是小编为大家带来的关于2022主题学生作文500字,希望能对大家

2022年高三毕业典礼演讲稿(精选文档)

最近发表了一篇名为《高三2022年毕业典礼演讲稿》的范文,觉得有用就收藏了,重新整理了一下发到这里。演讲是演讲者与听众、听众与听众的三角信息交流,演讲者不能以传达自己的思想和情感、情绪为满足,他必须能控制住自己与听众、听众与听众情绪的应和与交流。

五四精神演讲稿

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

学雷锋致英雄演讲稿怎么写(完整)

最近发表了一篇名为《学雷锋致英雄演讲稿怎么写》的范文,觉得应该跟大家分享,这里给大家转摘到。演讲稿特别注重结构清楚,层次简明。在日新月异的现代社会中,在很多情况下需要用到演讲稿,如何写一份恰当的演讲稿呢?下面是小编为大家整理的学致英雄演讲稿怎么写,希望能够帮助到大家!学雷锋致英雄

语文新课程纲要教材解读培训心得3篇通用

本页是最新发布的《语文新课程纲要教材解读培训心得3篇通用》的详细范文参考文章,觉得有用就收藏了,看完如果觉得有帮助请记得(CTRL+D)收藏本页。语文要让了解文章的含义,吸取其中的精华,感悟文章的写法。你知道语文心得的写法?不妨来学习一下如何写语文培训心得。你是否在找正准备撰写“语文新课程