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

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员工培训学习心得体会范本合集(范文推荐)

最近发表了一篇名为《员工培训学习心得体会范文》的范文,感觉写的不错,希望对您有帮助,为了方便大家的阅读。培训能让员工不断的提高,并清楚的意识到自己的缺点。经过员工培训,你一定有许多的收获,不妨来写一篇员工培训心得。你是否在找正准备撰写“员工培训心得体会范文”,下面小编收集了相关的素材,

冬至精彩优秀作文600字(全文)

最近发表了一篇名为《冬至精彩优秀作文600字【精选六篇】》的范文,好的范文应该跟大家分享,希望对网友有用。在古时候被认为是非常重要的日子,人们甚至将其称之为小年,每年过冬至的时候,都要做好许多准备,民间甚至有诸多的庆祝活动。下面小编在这里为大家精心整理了几篇冬至精彩优秀作文600字,希望对

建团百周年活动策划

《2022建团百周年活动策划【精选】》是一篇好的范文,感觉很有用处,希望大家能有所收获。党的领导是共青团顺利发展的关键所在,无论是中国早期青年团的建立,还是中国共青团的正式成立,都离不开党的领导。下面小编为大家整理了2022建团百周年策划【精选】的相关内容,以供参考,希望给大家带来帮助!20

关于珍爱生命作文800字高中【精选推荐】

范文参**网最近发表了一篇名为《2022关于珍爱生命的作文800字高中【】》的范文,感觉写的不错,希望对您有帮助,重新整理了一下发到这里。在平日的学习、工作和生活里,大家都不可避免地要接触到作文吧。下面小编为大家整理了2022关于的作文800字高中【5

《********大宣讲特别节目》直播观后感

最近发表了一篇名为《2022《********大宣讲特别节目》直播观后感【精选】》的范文,感觉写的不错,希望对您有帮助,希望对网友有用。,安全,在学校里,在校外,安全这个词恐怕是再熟悉不过了吧,让将安全铭记心中,时进刻刻都做到安全,让父母不再操心,让长辈不再担心,让安全从我做起,从身边

追梦筑梦圆梦演讲稿

最近发表了一篇名为《追梦筑梦圆梦演讲稿》的范文,感觉很有用处,这里给大家转摘到。演讲稿特别注重结构清楚,层次简明。在日新月异的现代社会中,在很多情况下需要用到演讲稿,如何写一份恰当的演讲稿呢?下面是小编为大家整理的追梦筑梦圆梦演讲稿,希望能够帮助到大家!追梦筑梦圆梦演讲稿1尊敬的

以小见大作文500字范本(范文推荐)

最近发表了一篇名为《以小见大作文500字范文【精选】》的范文,感觉写的不错,希望对您有帮助,重新编辑了一下发到。一件事情的发生,离不开时间、地点、人物、事情的起因、经过和结果这六方面,即常说的六要素,只有交待清楚这几方面,才能使读者对所叙述的事,有个清楚、全面的了解。这里小编

2022年大学生档案自我鉴定300字10篇

2022年普通大学生个人社会实践实习报告精选服务社会做好思想准备和业务准备,公司内部电脑系统都是统一英文系统,就要求自己以职场……[详细]2022年党员思想汇报例文两篇【完整版】所以在以后的学习和生活中,经历过苦难的中国,工作以及生活中,特别是通过学习党章党纪……[详细]企业员工服务意识培训心得体会

2022年度有关安全学习心得合集(2022年)

本页是最新发布的《有关安全学习心得》的详细范文参考文章,感觉很有用处,看完如果觉得有帮助请记得(CTRL+D)收藏本页。有了一些收获以后,可以记录在心得体会中,这么做能够提升的书面表达能力。相信许多人会觉得心得体会很难写吧,下面是小编为大家收集的有关学习心得,供大家参考借鉴,希望可以帮

2022年度中考优秀作文素材别样美三篇

最近发表了一篇名为《中考优秀作文素材别样的美精选三篇》的范文,好的范文应该跟大家分享,看完如果觉得有帮助请记得(CTRL+D)收藏本页。雨过天晴,花坛边上,几只蜗牛缓缓的爬行着,留下一道彩虹般的痕迹,那柔软的外面,是坚硬的外壳,那也是一道的美丽。下面是小编为大家收集整理的关于素材别样的美精

小学品德教师期末工作总结范本合集

最近发表了一篇名为《小学品德教师期末工作总结范文》的范文,感觉很有用处,重新整理了一下发到这里[http: www fwwang cn]。时光飞逝,如梭之日,回顾这段时间的工作,一定有许多的艰难困苦,是时候在工作总结中好好总结过去的成绩了。下面小编在这里为大家精心整理了几篇小学教师期

大一暑假社会实践报告(精选文档)

本页是最新发布的《2022大一暑假社会实践报告》的详细范文参考文章,感觉写的不错,希望对您有帮助,希望大家能有所收获。这个暑假过得是否充实呢,有些小伙伴在假期中参加了实践,那么如何做一份报告呢?下面是小编整理的2022大一暑假社会实践报告,仅供参考,希望能够帮助到大家。2022大一暑假社会