Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:理解框架的运行原理就是从url到类方法的映射, 这个很重要, 这也是路由的基础
<?php
// 路由原理
// 目标:将URL中的控制器,方法解析出来,映射到对应的控制器类和方法上
//解析--控制器、方法、参数(查询变量)
// http://phpedu.io/0514/routen1.php/user/getuserid?id=19&name=admin
// 控制器
class UserController
{
public function getUser($id, $name)
{
return "id ==> $id, name ==> $name";
}
}
// 1. 解析出PATHINFO,explode把字符串打散为数组,array_filter去空值,array_values返回数组的所有值(非键名)
$pathinfo = array_values(array_filter(explode('/', $_SERVER['PATH_INFO'])));
// 2. 解析控制器
$controller = ucfirst($pathinfo[0]) . 'Controller';
//$controller = ucfirst(array_shift($pathinfo)) . 'Controller';
// 3. 解析控制器中的方法
$action = $pathinfo[1];
//$action = array_shift($pathinfo);
// 4. 解析参数:将查询字符串存放到关联数组$params
parse_str($_SERVER['QUERY_STRING'], $params);
// 5. 调用控制器方法
$user = new $controller();
echo $user->$action(...array_values($params));
id ==> 19, name ==> admin
<?php
// 路由原理
// 目标:将URL中的控制器,方法解析出来,映射到对应的控制器类和方法上
//解析--控制器、方法、参数(路径变量)
// http://phpedu.io/0514/routen2.php/user/getuser/id/200/name/admin
// 控制器
class UserController
{
public function getUser($id, $name)
{
return "我的id ==> $id, 我的姓名 ==> $name";
}
}
// 1. 解析出PATHINFO,explode把字符串打散为数组,array_filter去空值,array_values返回数组的所有值(非键名)
$pathinfo = array_values(array_filter(explode('/', $_SERVER['PATH_INFO'])));
// 2. 解析控制器
$controller = ucfirst(array_shift($pathinfo)) . 'Controller';
// 3. 解析控制器中的方法
$action = array_shift($pathinfo);
// 4. 解析参数: pathinfo路径变量
// 这里放的是从pathinfo中解析出来的变量组成的数组
$params = [];
for ($i=0; $i<count($pathinfo); $i+=2) {
// 检查当前pathinfo变量是否有值?
if (isset($pathinfo[$i+1])){
$params[$pathinfo[$i]] = $pathinfo[$i+1];
}
}
// 5. 调用控制器方法
$user = new $controller();
echo $user->$action(...array_values($params));
我的id ==> 200, 我的姓名 ==> admin