摘要:本章主要学习了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
{
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
老师总结:基本上是照抄的教学代码, 不知你是否真的明白了, 应该写上你的理解