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

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全国中小学生日心得体会三篇为贯彻落实珍爱,安全第一为主题的中小学安全日教育活动,我校领导高度重视,紧紧围绕安全日安全教育这一主线,在师生中开展了丰富多

演讲感恩父母演讲稿最新10篇

《演讲感恩父母的演讲稿最新10篇》是一篇好的范文,感觉写的不错,希望对您有帮助,希望对网友有用。,汉语词汇,拼音gǎnēn。意思对别人所给的恩惠表示感激。出自《三国志·吴志·骆统传》:“飨赐之日,可人人别进,问其燥湿,加以密意,诱谕使言,察其志趣,令皆感恩戴义,怀欲报之心。”下面小编给大家带来关于演

2022年新员工培训心得怎么写合集通用(全文)

最近发表了一篇名为《新员工培训心得怎么写通用》的范文,感觉很有用处,重新整理了一下发到这里。培训能够拓展员工的视野,提升员工的能力,让员工在培训之中成长。员工培训心得对经历过员工培训的人具有许多的影响,你知道它的写法?你是否在找正准备撰写“新

2022年个人学习心得体会6篇(完整)

本页是最新发布的《个人学习心得体会精选6篇》的详细范文参考文章,好的范文应该跟大家分享,重新编辑了一下发到。当积累了新的体会时,不妨将其写成一篇心得体会,让自己铭记于心,这样有利于我们不断提升自我。那么问题来了,应该如何写心得体会呢?以下是小编精心整理的个人心得体会精选,一起来看

传承楚怡精神演讲稿最新,传承楚怡精神演讲稿【完整版】

《传承楚怡精神演讲稿2022年最新精选传承楚怡精神演讲稿》是一篇好的范文,感觉写的不错,希望对您有帮助,希望大家能有所收获。爱国、求知、创业、兴工,1909年,著名教育家陈润霖在筹办湖南私立楚怡初等工业学堂(后改名楚怡工业学校)时秉承的办学信念,正是这8个字。百年来,楚怡精神薪火相传,激励着一代又一

2022年村干部预备党员入党申请书范本(全文)

最近发表了一篇名为《村干部预备党员入党申请书范文》的范文,觉得有用就收藏了,希望大家能有所收获。村干部繁忙,但也要以党章为方向,作为一名基层干部,应该牢记的使命。今天小编在这给大家整理了一些村干部预备入党申请书,我们一起来看看吧!村干部预备党员入党申请书(1)敬爱的党组织:自从20__年_

三下乡社会实践心得通用10篇【优秀范文】

本页是最新发布的《三下乡社会实践心得通用10篇》的详细范文参考文章,觉得有用就收藏了,看完如果觉得有帮助请记得(CTRL+D)收藏本页。三下乡通常是大学生参加的一项,其主要内容是将先进的科技、文化和卫生知识带到社会发展相对落后的偏远地区。下面是小编给大家整理的关于三下乡社会心得通用,欢迎大

2022年爱细节作文600字初中范本

《2022爱的细节作文600字初中范文【】》是一篇好的范文,觉得应该跟大家分享,希望对网友有用。爱是冬日的一缕阳光,使饥寒交迫的人感到人间的温暖;爱是一场洒落在久旱的土地上的甘霖,使濒临绝境的人重新看到生活的希望;爱是一首飘落在夜空里的歌谣,使孤苦无依的人获得心灵的慰藉。下面小编为大家整理了20

愚人节祝福语简短一句话大全(完整文档)

本页是最新发布的《2022愚人节祝福语简短一句话大全》的详细范文参考文章,好的范文应该跟大家分享,希望大家能有所收获。节的历史起源于法国,最初是法国的一些主张变革的人为嘲笑那些因循守旧的人而在4月1日使出一些骗人的招数。后逐渐成为西方及美国的民间传统节日,现在也成为东方很多国家人们喜爱的节

2022年教师年度考核个人总结例文

最近发表了一篇名为《教师年度考核个人总结例文》的范文,觉得有用就收藏了,重新编辑了一下发到。在日常生活或是工作中,我们经常会写总结,面对年末的时候,你们知道教师是怎么写的工作总结?来了解下吧!以下是小编为大家带来的2022教师年度考核个人总结例文,希望您能喜欢!教师年度考核个人总

我喜欢一本书三年级作文400字范本(完整文档)

本页是最新发布的《我喜欢的一本书三年级作文400字范文》的详细范文参考文章,觉得有用就收藏了,为了方便大家的阅读。书是全世界的营养品,生活里没有书籍就好像没有阳光;智慧里没有书籍就好像鸟儿没有翅膀。下面是小编为大家收集整理的关于的书三作文400字范文,一起来看看吧!我喜欢的一本书三年级作文

2022年度教师学习心得体会模板合集

最近发表了一篇名为《教师学习心得体会模板》的范文,觉得应该跟大家分享,希望对网友有用。我们从一些事情上得到感悟后,往往会写一篇心得体会,这样就可以通过不断总结,丰富我们的思想。那么如何写心得体会才能更有感染力呢?下面是小编为大家整理的心得体会模板,欢迎阅读,希望大家能够喜欢。教师学习心