作者:手机用户2502892543 | 来源:互联网 | 2023-09-24 13:12
1、路由入门
例子:User
控制器中有2个方法
class User
{
public function show()
{
return '我来自广东!';
}
}
直接访问
如:http://php.pro/0805/demo1.php
// 直接访问:(忽略URL中参数)
echo (new User())->show(); //输出:我来自广东!`
通过Get参数访问
如:http://php.pro/0805/demo1.php?cOntroller=user&action=show
//输出:我来自广东!
// ucfirst() 函数把字符串中的首字符转换为大写
// 1、获取URL控制器名称
$controller = ucfirst($_GET['controller']);
// 2、获取URL方法名称
$action = $_GET['action'];
// 3、将获取的URL映射到一个类中的方法
echo (new $controller())->$action();
- 只要是采用MVC架构的项目,它的URL最终都会映射到一个类中的方法上(函数)上,如下图所示:
- 搜索引擎看到上面的具有GET参数的URL动态地址,并不喜欢,它喜欢静态地址(通过伪静态实现)
2、路由示例(伪静态:PATH_INFO方式)2.1 示例1:键值对关系的URL(user/show/id/5/name/peter)
namespace mvc;
class User
{
public function show($id, $name)
{
return '你好:'. $name.',你的id是:' . $id;
}
}
// 1、得到PATH_INFO信息
// $pathinfo = /user/show/id/15/name/peter
$pathinfo = $_SERVER['PATH_INFO'];
// 2、将PATH_INFO信息转为数组
// $pathinfoAr = Array ( [0] => [1] => user [2] => show [3] => id [4] => 15 [5] => name [6] => peter )
$pathinfoArr=explode('/',$pathinfo);
// 3、使用array_filter()过滤掉空元素
// $pathinfoArr1 = Array ( [1] => user [2] => show [3] => id [4] => 15 [5] => name [6] => peter )
$pathinfoArr1=array_filter($pathinfoArr);
// 4、使用array_values():将数据键名重置,从0开始
// $pathinfoArr2 = Array ( [0] => user [1] => show [2] => id [3] => 15 [4] => name [5] => peter )
$pathinfoArr2=array_values($pathinfoArr1);
// 5、从数组中获取控制器名称(包含命名空间)
// array_shift() 删除数组中第一个元素,并返回被删除元素的值(就是数组中的控制器名称)
// ucfirst() 将控制器名称首字母大写
// $cOntroller= mvc\User
$controller = __NAMESPACE__ . '\\' . ucfirst(array_shift($pathinfoArr2));
// 6、从数组中获取控制器方法
// $action = show
$action = array_shift($pathinfoArr2);
// 7、测试从URL到控制器方法的访问映射
;
// 从URL中解析出参数
// http://php.pro/0805/demo1.php/user/show/id/15/name/peter
$params = [];
for ($i = 0; $i < count($pathinfoArr2); $i+= 2) {
if (isset($pathinfoArr2[$i + 1])) $params[$pathinfoArr2[$i]] = $pathinfoArr2[$i + 1];
}
// 使用对象数组
// echo (new $controller())->$action($params['id'],$params['name']);
// 使用回调函数处理数组
echo call_user_func_array([(new $controller), $action], $params);
2.2 示例2:只有值的URL(user/show/5/peter)
namespace mvc;
// http://php.pro/0805/demo1.php/user/show/15/peter
// 使用控制器名称+方法+参数(值)方式访问
// 思路:pathinfo第一个控制器名称,第二个方法名称,最后获取参数(值)
class User
{
public function show($id, $name)
{
return '你好:'. $name.',你的id是:' . $id;
}
}
// 获取命名空间
function getNamespace(){
return __NAMESPACE__;
}
// 获取类名
function getClass($pathinfo){
$class=array_shift(array_values(array_filter(explode('/',$pathinfo))));
return $class;
}
// 获取方法名
function getMethod($pathinfo){
$arr=array_values(array_filter(explode('/',$pathinfo)));
array_shift($arr);
$method = array_shift($arr);
return $method;
}
// 获取控制器(含命名空间)mvc\User
function getController(){
$controller = getNamespace(). '\\' . ucfirst(getClass($_SERVER['PATH_INFO']));
return $controller;
}
// echo getController();
// 获取方法参数
// array_splice()删除数组指定长度元素并返回删除元素
function getParameter($pathinfo){
$parameter=array_splice(array_values(array_filter(explode('/',$pathinfo))),2,2);
return $parameter;
}
$parameter=getParameter($_SERVER['PATH_INFO']);
$controller=getController();
$action=getMethod($_SERVER['PATH_INFO']);
// 使用对象数组参数
// echo (new $controller())->$action($parameter[0],$parameter[1]);
// 使用回调函数处理
echo call_user_func_array([(new $controller), $action], $parameter);
总结
- 通过
$_SERVER['PATH_INFO'])
获取URL参数信息映射到控制器中的方法,实现一个简单路由; - 主要都是数组操作,前期知识又重新学习了一遍;