主要内容:
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最终都会映射到一个类中的方法上(函数)。
1. 示例
<?php
// http://php.edu/0805/demo1.php?controler=user&action=show
class 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
2. 示例2
<?php
namespace 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);
3. 作业内容
- 仿照课堂案例,实现一个简单的URL到控制器方法的映射
- 安装composer
- 选做: URL中的pathinfo参数不使用键名,全部由值组成,应该如何实现解析与引用,如 /10/peter, 而不是/id/10/name/peter格式?
<?php
namespace 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);