摘要:本章主要学习了MVC的架构原理,并通过配置简单的路由,实现类到路由方法的映射,代码如下:<?php /**路由类*/ namespace pong; class Route { protected $route=[]; protected $passIn
本章主要学习了MVC的架构原理,并通过配置简单的路由,实现类到路由方法的映射,代码如下:
<?php
/**路由类*/
namespace pong;
class Route
{
protected $route=[];
protected $passInfo=[];
protected $params=[];
public function __construct($route)
{
$this->route=$route;
}
/**
* @param string $queryStr 链接参数
* @return $this 当前类的实例
*/
public function parse($queryStr='')
{
//去除字符串左右的/,并将参数全部转为小写
$queryStr=strtolower(trim($queryStr,'/'));
//通过/把字符串转成数组
$queryArr=explode('/',$queryStr);
//数组过滤掉空字符
$queryArr=array_filter($queryArr,function($value){
return trim($value)!='';
},ARRAY_FILTER_USE_BOTH);
//判断数组中有几个参数
switch (count($queryArr))
{
case 0:
$this->passInfo = $this->route;
break;
case 1:
$this->passInfo['module']=$queryArr[0];
break;
case 2:
$this->passInfo['module']=$queryArr[0];
$this->passInfo['controller']=$queryArr[1];
break;
case 3:
$this->passInfo['module']=$queryArr[0];
$this->passInfo['controller']=$queryArr[1];
$this->passInfo['action']=$queryArr[2];
break;
default:
$this->passInfo['module']=$queryArr[0];
$this->passInfo['controller']=$queryArr[1];
$this->passInfo['action']=$queryArr[2];
//从第四个元素开始遍历,即过滤掉路由的信息
for($i=3;$i<count($queryArr);$i+=2)
{
if(isset($queryArr[$i+1]))
{
$this->params[$queryArr[$i]]=$queryArr[$i+1];
}
}
break;
}
//返回当前对象
return $this;
}
public function dispatch()
{
//模块名
$module = $this->passInfo['module'];
//控制器名
$controller='\app\\' .$module . '\controller\\' . ucfirst($this->passInfo['controller']) ;
//操作
$action= $this->passInfo['action'];
//如果找不到,重新返回根目录
if(!method_exists($controller,$action))
{
header('location:/');
}
return call_user_func_array([new $controller,$action],$this->params);
}
}
//测试
$config=require __DIR__.'/Config.php';
$route=new Route($config['route']);
//测试请求分发
require __DIR__ . '/../app/admin/controller/Index.php';
print_r($route->parse($_SERVER['QUERY_STRING'])->dispatch()) ;Config.php
<?php /** * 配置文件 */ return [ //应用配置 'app'=>[ //调试开关 'debug'=>true ], //路由配置 'route'=>[ //默认模块 'module'=>'admin', //默认控制器 'controller'=>'Index', //默认操作 'action'=>'index' ], 'db'=>[ // 数据库类型 'database_type' => 'mysql', // 默认数据库名称 'database_name' => 'frame', // 默认主机名 'server' => 'localhost', // 默认用户名 'username' => 'root', // 用户密码 'password' => 'root', // 编码 'charset' => 'utf8', //端口 'port' => 3306, ] ];
Index.php
<?php
namespace app\admin\controller;
class Index
{
public function hello($name,$age)
{
return '我是调用的方法。姓名:' . $name . ',年龄:' . $age;
}
}调用地址:
域名/pong/route.php?/admin/Index/Hello/name/pong/age/26
效果图:

批改老师:天蓬老师批改时间:2019-01-24 10:44:17
老师总结:基本上是照抄的教学代码, 不知你是否真的明白了, 应该写上你的理解