批改状态:合格
老师批语:如果自己想, 能不能写出类似的功能呢
url路由机制:
① 路由机制就是把某一个特定形式的URL结构进行解析,提炼出系统对应的参数。如:http://main.test.com/article/1 其中:/article/1 -> ?_m=article&id=1。
② 然后将拥有对应参数的URL转换成特定形式的URL结构,也就是上面过程的逆向过程。
③ 如果一个页面的内容呈现,需要根据url上传递的参数来进行渲染。很多时候可能是这样子写:xxx.com/xx?c=x&m=x&t=..,而我们看到的url往往是这样子的(以新浪微游戏的咖啡恋人为例) game.weibo.com/ilovecoffee….这种URL设计看上去比前一种更好一点:) - (o - 伪静态)
一些参考资料可以见这个网页:https://www.jb51.net/article/96576.htm
只要是采用MVC架构的项目,它的URL最终都会映射到一个类中的方法上(函数)。
<?php// http://php.edu/0805/demo1.php?controler=user&action=showclass UserController{public function show(){return 'Hello Wrold';}}// 此时通过GET参数解析出来了控制器和方法// user ==> UserController$controller = ucfirst($_GET['controller']) . 'Controller';$action = $_GET['action'];// echo (new $controller())->show();// 搜索引擎看到上面的具有GET参数的URL动态地址,并不喜欢,它喜欢静态地址http://php.edu/0805/demo1.php?controler=user&action=show// 将上面的地址改成: PATH_INFO格式// http://php.edu/0805/demo1.php/user/show// /user/show: 就像是服务器上的路径信息, path-info// URL地址字符串不支持空格,所以会自动转义它echo $_SERVER['PATH_INFO'], '<br>';echo $_SERVER['REQUEST_URI'], '<br>';echo $_SERVER['QUERY_STRING'], '<br>';//将URL地址进行编码echo urlencode('p=6&name=peter zhu'), '<br>';echo urldecode('p%3D6%26name%3Dpeter+zhu');echo '<hr>';// parse_url(): 解决URL的各个部分,并返回一个数组print_r(parse_url($_SERVER['REQUEST_URI']));// pathinfo(): 返回当前脚本的路径信息,以数组方式print_r(pathinfo($_SERVER['REQUEST_URI']));//parse_str(): $_SERVER['QUERY_STRING'],将查询字符串以数组的方式返回parse_str($_SERVER['QUERY_STRING'], $res);print_r($res);// 生成一个查询字符串echo http_build_query(['id'=>20, 'email'=>'admin@php.cn', 'p'=>4]);// id=20&email=admin%40php.cn&p=4
<?phpnamespace mvc;class UserController{public function show($id, $name){return 'Hello '. $name.',id = ' . $id;}}// array_filter()过滤掉空元素// array_values():将数据键名重置,从0开始$pathinfo = array_values(array_filter(explode('/',$_SERVER['PATH_INFO'])));// print_r($pathinfo);// 生成控制器名称$controller = __NAMESPACE__ . '\\' . ucfirst(array_shift($pathinfo)) . 'Controller';// 解析控制器方法$action = array_shift($pathinfo);// 测试从URL到控制器方法的访问映射// echo (new $controller)->$action();// echo call_user_func([(new $controller), $action]);// 从URL中解析出参数// 参数以path_info方式提供:/id/15/name/peter// print_r($pathinfo);此时$pathinfo保存着参数// print_r($pathinfo);$params = [];for ($i = 0; $i < count($pathinfo); $i+= 2) {if (isset($pathinfo[$i + 1])) $params[$pathinfo[$i]] = $pathinfo[$i + 1];}// print_r($params);echo call_user_func_array([(new $controller), $action], $params);
<?phpnamespace my_mvc_test;class MyController{public function show ($id,$p){return 'id='.$id.'----'.'p='.$p;}}$pathinfo = array_values(array_filter(explode("/",$_SERVER['PATH_INFO'])));$controller = __NAMESPACE__."\\".ucfirst(array_shift($pathinfo))."Controller";$action = array_shift($pathinfo);$params = [];for ($i=0;$i<count($pathinfo);$i+=2){if (isset($pathinfo[$i+1])){$params[$pathinfo[$i]] = $pathinfo[$i+1];}}print_r($params);echo call_user_func_array([(new $controller()),$action],$params);
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号