PHP Router如何实现点击按钮/a标签调用views目录下对应页面
PHP Router实现点击跳转加载对应视图页面操作方案
- 第一步:修改index.php中的a标签跳转路径
你当前的a标签href属性为空,需要和routes.php中定义的路由规则对应,修改后代码如下:
<div class="menu-item"><a href="/contact">Contact</a></div> <div class="menu-item"><a href="/message">Send Message</a></div>
如果你的项目部署在域名子目录下(比如http://domain.com/myproject/),则需要将href改为/myproject/contact和/myproject/message。
- 第二步:补全router.php的路由匹配逻辑
你当前贴出的route函数只处理了根路径匹配的场景,缺少请求方法判断、非根路径匹配逻辑,补全后的完整代码如下:
function any($route, $path_to_include){ route($route, $path_to_include); } function get($route, $path_to_include){ if ($_SERVER['REQUEST_METHOD'] === 'GET') { route($route, $path_to_include); } } function post($route, $path_to_include){ if ($_SERVER['REQUEST_METHOD'] === 'POST') { route($route, $path_to_include); } } function route($route, $path_to_include){ $ROOT = $_SERVER['DOCUMENT_ROOT']; if($route == "/"){ include_once("$ROOT/$path_to_include"); exit(); } $request_url = filter_var($_SERVER['REQUEST_URI'], FILTER_SANITIZE_URL); $request_url = rtrim($request_url, '/'); $request_url = strtok($request_url, '?'); $route_parts = explode('/', $route); $request_url_parts = explode('/', $request_url); array_shift($route_parts); array_shift($request_url_parts); if( $route_parts[0] == '' && count($request_url_parts) == 0 ){ include_once("$ROOT/$path_to_include"); exit(); } // 新增非根路由匹配逻辑 if (count($route_parts) != count($request_url_parts)){ return; } $parameters = []; for($i = 0; $i < count($route_parts); $i++){ $route_part = $route_parts[$i]; // 支持动态路由参数匹配 if( preg_match("/^[{].*[}]$/", $route_part) ){ $parameters[] = $request_url_parts[$i]; } else if($route_part != $request_url_parts[$i]){ return; } } include_once("$ROOT/$path_to_include"); exit(); }
- 第三步:配置Web服务器URL重写规则
不配置重写规则的话,直接访问/contact会触发404错误,根据你使用的服务器选择对应配置:- Apache服务器:在项目根目录新建
.htaccess文件,添加如下规则
- Apache服务器:在项目根目录新建
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.*$ /index.php [L]
- Nginx服务器:在站点配置文件中添加如下规则
location / { try_files $uri $uri/ /index.php?$query_string; }
- 第四步:确认入口文件加载顺序
在index.php的最顶部优先引入路由相关文件,保证路由逻辑先执行:
<?php include_once 'router.php'; include_once 'routes.php'; // 下方为原有index.php页面代码 ?>
所有配置完成后,点击对应a标签就会自动匹配路由规则,加载views目录下的对应页面文件。
内容的提问来源于stack exchange,提问作者Abraham
相关产品推荐
相关产品推荐

