巅云智能建站平台搭建版(创业门户版)火爆上线,终身授权!新增:文章智能采集+全站真静态打包+城市分站+智能小程序+非法词过滤+H5自适应+智能链词等功能功能详情
建站专提News

自制PHP框架之路由与控制器

一佰互联网站开发设计(www.yinxi.net) 发布日期 2019-04-26 09:01:54 浏览数: 79

我们为什么要使用路由?原因1:一个更漂亮的URI

1.URI的改进

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

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

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

www.mysite.com/blog/1

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

2.实现方法

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

RewriteEngine OnRewriteRule ^([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);

核心代码如下:

if(isset($_SERVER["PATH_INFO"])){  $path=$_SERVER["PATH_INFO"];  $path=ltrim($path,"/");  $path_arr=explode("/", $path);} if(isset($path_arr[0])){  $key=$path_arr[0];  unset($path_arr[0]);}else{  $key="";} if(isset($path_arr[1])){  $parameters=array_values($path_arr);}  if(isset($route[$key])){  $arr=explode("@", $route[$key]);     $controller=new $arr[0];  $action=$arr[1];     if(isset($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"=>function(){echo "hello";}]; 

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

if(isset($route[$key])){  if($route[$key] instanceof Closure){    $route[$key]();  }  else{    $arr=explode("@", $route[$key]);      $controller=new $arr[0];    $action=$arr[1];      if(isset($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){ ?>        <div>        <?php echo $key.":".$value; ?>        </div>    <?php } ?>  </body></html>

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

一佰互联是全国知名建站品牌服务商,我们有九年网站建设、网站制作、网页设计、php开发和域名注册及虚拟主机服务经验,提供的自助建站服务更是全国有名。近年来还整合团队优势自主开发了可视化多用户”巅云建站系统“3.0平台版,拖拽排版网站制作设计,轻松实现pc站、手机微网站、小程序、APP一体化全网营销网站建设 ,已成功的为全国上百家网络公司提供自助建站平台搭建服务。

相关新闻more

26
03月
自媒体赚钱的本质是什么,为什么很多人赚不到钱

简介:在互联网接触的越久,越发觉得自己的渺小。看到了太多年轻有为的牛人,一个2-3人的团队年收入足以秒杀很多中小企业。井底之蛙说的就是我这种... >>详情

26
04月
thinkPHP5.0框架独立配置与动态配置

本文实例讲述了thinkPHP5.0框架独立配置与动态配置方法。分享给大家供大家参考,具体如下:独立配置文件:新版支持配置文件分离,只需要配... >>详情

01
04月
资深运营告诉你,店铺爆款群如何打造

简介:做一个成功的爆款是我们所有淘宝卖家的期望,爆款可以给店铺带来很多的访客、给店铺赚很多的钱、可以让店铺的销售额一直提升从而让店铺冲到下个... >>详情

07
04月
用3个真实案例,告诉你如何选择适合自己的工作

本章节我们通过三个真实案例来深度分析如何找到适合自己的工作,在行业中稳步前进,不断提高,最终成为一名优秀的设计师,获得行业认可,实现自我价值... >>详情

高端网站建设

美工兼顾SEO,为企业电子商务营销助力!

电话:

023-85725751
建站

产品

域名注册 虚拟主机 云服务器 企业邮局
智能建站 APP打包 微站/小程序 创业平台
网站推广 媒体营销 智能采集 AI机器人
400电话 短信营销 店销机器人
私人定制 门户网站