<?php
require __DIR__ . '/../helper.php';
// ! 路由: 从url中解析出控制器和方法,参数
// ! 方案1: get请求, 从查询字符串中解析出控制器,方法和参数
$url = 'http://php.edu/0507/router/demo1.php?c=user&a=hello';
// * 查询字符串:url问号后面的键值对: c=user&a=hello
// 1.parse_url()
// p(parse_url($url));
// p(parse_url($url)['query']);
// 2. $_SERVER['REQUEST_URI']
p($_SERVER['REQUEST_URI']);
// p(parse_url($_SERVER['REQUEST_URI']));
// p(parse_url($_SERVER['REQUEST_URI'])['query']);
// 3. $_SERVER['QUERY_STRING'] = parse_url($_SERVER['REQUEST_URI'])['query']
// p($_SERVER['QUERY_STRING']);
// 为处理方便,将字符串转为数组
// 2. parse_str
// c = user & a = hello ===> ['c'=>'user', 'a'=>'hello']
parse_str($_SERVER['QUERY_STRING'], $params);
p($params);
// 过滤一下空值
p(array_filter($params));
$params = array_filter($params);
echo '<hr color=red >';
// 路由测试
class UserController
{
public static function hello($id = 1, $name = 'zhu')
{
return "<h3>Hello id=$id, name=$name</h3>";
}
}
// 约定, get参数中
// c 表示控制器
// a 表示控制器中的方法
// UserController
// p(ucfirst(array_shift($params)) . 'Controller');
$controller = ucfirst(array_shift($params)) . 'Controller';
$action = array_shift($params);
// http://php.edu/0507/router/demo1.php?c=user&a=hello&id=12&name=peter
echo call_user_func_array([$controller, $action], $params);
<?php
require __DIR__ . '/../helper.php';
// ! 主流路由解决方案: pathinfo
$url = 'http://php.edu/0507/router/demo2.php?c=user&a=hello';
p(pathinfo($url));
// 这个pathinfo不是我们要的
// 我们真正需要的是位于脚本名demo2.php与?xxxx查询字符串之间的路径信息
$url = 'http://php.edu/0507/router/demo2.php/one/two/three?c=user&a=hello';
p(pathinfo($url));
// $_SERVER['PATH_INFO']
// p($_SERVER['PATH_INFO']);
// 以单一入口为例
// index.php?m=模块,例如前台home,后台admin
// 单入口
// index.php/模块/控制器/方法
// index.php/module/controller/action
// 多入口
// 前台: index.php 做为入口 不需要模块, controller/action
// 后台: admin.php 做为入口, 不需要模块, controller/action
$url = 'http://php.edu/0507/router/demo2.php/admin/user/index';
p($_SERVER['PATH_INFO']);
p(explode('/', trim($_SERVER['PATH_INFO'], '/')));
// p(array_filter(explode('/', $_SERVER['PATH_INFO'])));
$request = explode('/', trim($_SERVER['PATH_INFO'], '/'));
// 将模块,控制器和方法解析出来了
[$module, $controller, $action] = $request;
// printf('模块: %s <br> 控制器: %s<br>方法: %s<br>', $module, $controller, $action);
// 从pathinfo中解析出参数
$url = 'http://php.edu/0507/router/demo2.php/admin/user/index/1/admin';
// 1 -> id = 1
// admin -> name = admin
// 按顺序传递参数
$url = 'http://php.edu/0507/router/demo2.php/admin/user/index/id/1/name/admin';
// id/1 = id = 1
// name/admin -> name = admin
// 按键名进行传递
require 'User.php';
// 调用: admin\User::index()
// 类名
$className = $module . '\\' . ucfirst($controller);
p($className);
$params = array_splice($request, 3);
echo call_user_func_array([$className, $action], $params);
// call_user_func_array 参数见下图
// p($params);
// Array
// (
// [0] => 15
// [1] => admin
// )
// Array
// (
// [id] => 15
// [name] => admin
// )
// p(array_chunk([1, 2, 3, 4, 5, 6, 7], 2));
// $arr = array_chunk($params, 2);
// $result = [];
// foreach ($arr as $item) {
// [$key, $value] = $item;
// $result[$key] = $value;
// }
// p($result);
// $result = array_filter($result);
// p($result);
// echo call_user_func_array([$className, $action], $result);