• Welcome to Journal web site.

我是 PHP 程序员

- 开发无止境 -

Next
Prev

第13章 0507-路由,视图、数据库模型基类详解

Data: 2019-03-21 23:30:05Form: JournalClick: 0

demo1:路由获取

<?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);


demo2:路由传值

<?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);

image.png

image.png

image.png

Name:
<提交>