路由处理
1.URL处理函数
<?php
// 路由原理
// 目标:将URL中的控制器,方法解析出来,映射到对应的控制器类和方法上
// http://php11.cn/teachPHP/tcdemo/router/demo1.php?action=edit&id=19&name=admin
// 返回一个查询字符串分解的数组
// print_r($_GET);
// echo implode(',', $_GET);
// ?action=edit&id=19&name=admin
//printf('?action=%s&id=%s&name=%s',$_GET['action'],$_GET['id'],$_GET['name']);
//vprintf('?action=%s&id=%s&name=%s',$_GET);
/**
* URL/查询变量/GET变量($_SERVER['QUERY_STRING']): action=edit&id=19&name=admin
*/
// echo '查询字符串: ' . $_SERVER['QUERY_STRING'];
// echo '<hr>';
// http:://php.edu/0514/route.php/action/edit/id/19/name/admin
/**
* PATHINFO变量/ 路径变量($_SERVER['PATH_INFO']): /action/edit/id/19/name/admin
*/
//echo 'PATHINFO变量: ' . $_SERVER['PATH_INFO'];
//echo '<hr>';
/**
* pathinfo:返回一个关联数组包含有 path 的信息
* Array ( [dirname] => 0514 [basename] => route.php [extension] => php [filename] => route )
*/
// print_r(pathinfo('0514/route.php'));
/**
* 取得当前度URL的路径地址 :/teachPHP/tcdemo/router/demo1.php/action/edit/id/19/name/admin
*/
// http:://php.edu/0514/route.php/控制器/方法/参数1/值1/参数2/值2/....
//echo 'http://php.edu' . $_SERVER['REQUEST_URI'];
//echo '<hr>';
2.get传参处理
<?php
//测试地址http://php11.cn/teachPHP/tcdemo/router/demo1.php/user/getuser?id=19&name=admin
//控制器
class UserController
{
public function getUser($id,$name)
{
return "id=> $id , name => $name";
}
}
//1.解析出pathinfo
$pathinfo = array_values(array_filter(explode('/',$_SERVER['PATH_INFO'])));
//2.解析控制器
$controller = ucfirst(array_shift($pathinfo)) . 'Controller';
//3.解析控制器中的方法
$action = array_shift($pathinfo);
// 4. 解析参数 parse_str — 将字符串解析成多个变量
parse_str($_SERVER['QUERY_STRING'], $params);
// 5. 调用控制器方法
$user = new $controller();
echo $user->$action(...array_values($params));// 5. 调用控制器方法
3.”/“传参处理
<?php
// 路由原理
// 目标:将URL中的控制器,方法解析出来,映射到对应的控制器类和方法上
//测试地址
http://php11.cn/teachPHP/tcdemo/router/demo2.php/user/getuser/id/200/name/admin
//控制器
class UserController
{
public function getUser($id,$name)
{
return "id=> $id , name => $name";
}
}
//1.解析出pathinfo
$pathinfo = array_values(array_filter(explode('/',$_SERVER['PATH_INFO'])));
//2.解析控制器
$controller = ucfirst(array_shift($pathinfo)) . 'Controller';
//3.解析控制器中的方法
$action = array_shift($pathinfo);
// 4. 解析参数
// 这里放的是从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));// 5. 调用控制器方法