如何在CodeIgniter结构的过程式PHP网站中实现路由功能?
实现过程式PHP网站的CodeIgniter风格路由
完全可以给你的过程式PHP网站实现类似CodeIgniter的简洁路由,核心思路是通过URL重写把所有请求导向统一入口文件,再在入口文件里手动解析URL并映射到对应的控制器文件和函数,下面是具体实现步骤:
1. 配置URL重写(.htaccess)
在网站根目录创建.htaccess文件,将所有非静态资源的请求转发到根目录的index.php(和CI的入口逻辑一致):
RewriteEngine On # 排除实际存在的文件和目录(比如assets下的静态资源) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 将所有请求转发到index.php,保留URL路径 RewriteRule ^(.*)$ index.php/$1 [L]
2. 编写根目录入口文件index.php
这个文件是所有请求的统一入口,负责解析URL、加载对应控制器、调用目标函数:
<?php // 定义全局路径常量,方便后续引用文件 define('BASEPATH', __DIR__ . '/'); define('APPPATH', BASEPATH . 'app/'); // 获取并清理URL路径 $uri = isset($_SERVER['REQUEST_URI']) ? trim($_SERVER['REQUEST_URI'], '/') : ''; // 拆分URL为分段(对应CI的URI分段) $segments = explode('/', $uri); // 设置默认路由规则(访问根目录时的默认控制器和方法) $default_controller = 'home'; $default_method = 'index'; // 提取控制器、方法和参数 $controller = !empty($segments[0]) ? $segments[0] : $default_controller; $method = !empty($segments[1]) ? $segments[1] : $default_method; $params = array_slice($segments, 2); // 构建控制器文件路径(对应app/controllers下的PHP文件) $controller_file = APPPATH . 'controllers/' . $controller . '.php'; // 处理控制器不存在的情况 if (!file_exists($controller_file)) { include APPPATH . 'views/404.php'; exit; } // 加载目标控制器文件 include $controller_file; // 处理方法不存在的情况 if (!function_exists($method)) { include APPPATH . 'views/404.php'; exit; } // 调用目标方法并传递参数 call_user_func_array($method, $params); ?>
3. 编写过程式控制器示例
在app/controllers/下创建控制器文件(比如home.php),里面写对应功能的函数:
<?php // 按需加载辅助函数和库(和CI加载helper、library逻辑一致) include APPPATH . 'helpers/url_helper.php'; include APPPATH . 'libraries/validation_lib.php'; // 默认方法:首页 function index() { // 加载视图文件 include APPPATH . 'views/home/index.php'; } // 关于页方法,支持传入参数 function about($name = '') { $data['visitor_name'] = $name ?: 'Guest'; include APPPATH . 'views/home/about.php'; } ?>
4. 可选:自定义路由规则
如果需要像CI那样设置自定义路由(比如把/blog/123映射到article/detail/123),可以在入口文件的URL解析部分添加路由匹配逻辑:
// 在拆分URI分段之前添加这段代码 $routes = [ // 正则匹配URL,映射到目标控制器/方法 'blog/(\d+)' => 'article/detail/$1', 'contact-us' => 'contact/index' ]; // 遍历匹配自定义路由 foreach ($routes as $pattern => $target) { if (preg_match("#^$pattern$#", $uri)) { $uri = preg_replace("#^$pattern$#", $target, $uri); $segments = explode('/', $uri); break; } }
5. 静态资源兼容
因为.htaccess里已经排除了实际存在的文件和目录,所以assets、files目录下的静态资源(CSS、JS、图片等)会直接被访问,不会经过入口文件,和CI的行为一致。
内容的提问来源于stack exchange,提问作者Redhead
相关产品推荐
相关产品推荐

