文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用Composer从零开发一个简单的web框架(03)-路由

admin

admin

2024-04-02 17:21

关注

获取和解析参数

编辑core/functions.php,添加相关功能函数

<?php
namespace core;



function path_sure($path) {
    if (!file_exists($path)) mkdir($path, 0777, true);
}


function url_original($uri) {
    $t = explode('?', $uri, 2);

    return $t[0];
}


function url_to_mod($uri, $root = '/') {
    $uri     = explode($root, $uri, 2);
    $uri     = explode('.', urldecode($uri[1]), 2);
    $uri    = explode('/', $uri[0]);

    $mod    = [];
    foreach ($uri as $v) $v !== '' && $mod[] = $v;

    return $mod;
}


function uri_full() {
    $pageURL = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
    $pageURL .= $_SERVER['HTTP_HOST'];

    return $pageURL;
}

编辑core/App.php,添加parsestart函数

// 解析参数
private function parse($argv) {
   // cli 命令行模式(php public/index.php app/controller/method)
   if ('cli' === PHP_SAPI) {
       $mod = url_to_mod('/' . $argv[1]);
   } else {
       $uri = url_original($_SERVER['REQUEST_URI']);
       $mod = url_to_mod($uri);
   }

   return $mod;
}

// 拼接控制器和函数并运行
function start($mod) {
   // 检查是否设置了默认 应用、控制器、方法
   defined('DEFAULT_APP') or define('DEFAULT_APP', 'home');
   defined('DEFAULT_CONTROLLER') or define('DEFAULT_CONTROLLER', 'Index');
   defined('DEFAULT_METHOD') or define('DEFAULT_METHOD', 'index');

   if (empty($mod) || !is_array($mod)) {
       // cli 命令行模式
       if ('cli' === PHP_SAPI) {
           echo 'run as: php public/index.php app/controller/method';
       } else {
           header('Location:' . uri_full() . '/' . DEFAULT_APP . '/' . DEFAULT_ConTROLLER . '/' . DEFAULT_METHOD);
       }
       exit();
   }

   $method = null;
   if ($mod[1]) {
       $app        = $mod[0];
       $controller = $mod[1];
       $filename   = PATH_APP . $app . '/controller/' . $controller . '.php';
       if (file_exists($filename)) {
           if ($mod[2]) $method = $mod[2];
       } else {
           $controller = DEFAULT_CONTROLLER;
           $method     = $mod[1];
       }
   } else {
       $app        = $mod[0];
       $controller = DEFAULT_CONTROLLER;
       $method     = DEFAULT_METHOD;
   }

   define('APP',       $app);
   define('CONTROLLER',$controller);

   // 控制器类文件名大写
   $controllerFile = ucfirst($controller);
   $module = "app\\{$app}\\controller\\{$controllerFile}";
   echo '$module:' . $module . ',method:' . $method;
}


编辑 core/App.php 文件,修改构造函数相关调用

public function __construct($argv) {
   $this->setEnv();
   $mod = $this->parse($argv);
   $this->start($mod);
}


测试

新建app/home/controller/Hello.php文件

浏览器访问 phpweb.com/home/hello/world 或控制台运行 php public/index.php home/hello/world,输出

$module:app\home\controller\Hello,method:world

浏览器访问 phpweb.com/home/hello 或控制台运行 php public/index.php home/hello,输出

$module:app\home\controller\Hello,method:

这时我们发现 method 是没有的,这种情况下个章节处理

浏览器访问 phpweb.com/home 或控制台运行 php public/index.php home,输出

$module:app\home\controller\Index,method:index

浏览器访问 http://phpweb.com,输出

$module:app\home\controller\Index,method:Index

因为框架解析参数时,发现为空,跳转到了默认 应用/控制器/方法

制台运行 php public/index.php,输出

run as: php public/index.php app/controller/method

输出直接显示怎么使用命令行的提示

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     428人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     199人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     159人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     239人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     62人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯