视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
php如何实现url路由分发功能
2020-11-02 18:25:52 责编:小采
文档


php实现url路由分发功能的方法:首先要在服务器的配置上对【/router/】路径进行拦截;然后实现路由分发器,并获取请求的uri;最后进行模块的编写。

【相关学习推荐:php图文教程】

php实现url路由分发功能的方法:

第一步,首先要在服务器的配置上对/router/路径进行拦截

调用某个文件夹目录下的index.php页面,假定现在所有模块使用单独的文件存放于class目录下,该目录与router平级,如下图所示:

第二步,路由分发器的实现(index.php)

<!Doctype html>
 <html>
 <head>
 <title>路由测试~~</title>
 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
 </head>
<body>
<?php
date_default_timezone_set("Asia/Shanghai");
 define("MODULE_DIR", "../class/");
 $_DocumentPath = $_SERVER['DOCUMENT_ROOT'];
 $_FilePath = __FILE__;
 $_RequestUri = $_SERVER['REQUEST_URI']; 
 $_AppPath = str_replace($_DocumentPath, '', $_FilePath); //==>
outerindex.php
 $_UrlPath = $_RequestUri; //==>/router/hello/router/a/b/c/d/abc/index.html?id=3&url=http:
 $_AppPathArr = explode(DIRECTORY_SEPARATOR, $_AppPath);
 
 /**
 * http://192.168.0.33/router/hello/router/a/b/c/d/abc/index.html?id=3&url=http:
 * 
 * /hello/router/a/b/c/d/abc/index.html?id=3&url=http:
 */ 
 for ($i = 0; $i < count($_AppPathArr); $i++) {
 $p = $_AppPathArr[$i];
 if ($p) {
 $_UrlPath = preg_replace('/^/'.$p.'//', '/', $_UrlPath, 1);
 }
 }
 
 $_UrlPath = preg_replace('/^//', '', $_UrlPath, 1);
 
 $_AppPathArr = explode("/", $_UrlPath);
 $_AppPathArr_Count = count($_AppPathArr);
 
 $arr_url = array(
 'controller' => 'index',
 'method' => 'index',
 'parms' => array()
 );
 
 $arr_url['controller'] = $_AppPathArr[0];
 $arr_url['method'] = $_AppPathArr[1];
 
 if ($_AppPathArr_Count > 2 and $_AppPathArr_Count % 2 != 0) {
 die('参数错误');
 } else {
 for ($i = 2; $i < $_AppPathArr_Count; $i += 2) {
 $arr_temp_hash = array(strtolower($_AppPathArr[$i])=>$_AppPathArr[$i + 1]);
 $arr_url['parms'] = array_merge($arr_url['parms'], $arr_temp_hash);
 }
 }
 
 $module_name = $arr_url['controller'];
 $module_file = MODULE_DIR.$module_name.'.class.php';
 $method_name = $arr_url['method'];
 
 if (file_exists($module_file)) {
 include $module_file;
 
 $obj_module = new $module_name();
 
 if (!method_exists($obj_module, $method_name)) {
 die("要调用的方法不存在");
 } else {
 if (is_callable(array($obj_module, $method_name))) {
 $obj_module -> $method_name($module_name, $arr_url['parms']);
 
 $obj_module -> printResult();
 }
 }
 
 } else {
 die("定义的模块不存在");
 }
 
 ?>
 
</body>
 </html>

获取请求的uri,然后拿到要加载的模块名、调用方法名,对uri参数进行简单的判断..

第三步,模块的编写

根据上述的uri,我们要调用的是Hello模块下的router方法,那么可以在class目录下定义一个名为Hello.class.php的文件(注意linux下是区分大小写的)

<?php
class Hello {
 private $_name;
private $_varValue;
 
 function __construct() {
 
 }
 
 function router() {
 $this->_name = func_get_arg(0);
 $this->_varValue = func_get_arg(1);
 } 
 function printResult() {
 echo $this->_name;
 echo "<p>";
 echo var_dump($this->_varValue);
 echo "</p>";
 }
 }
 ?>

同理,我们可以编写Ha模块..

这算是实现了很简单的url路由分发功能了…

相关学习推荐:php编程(视频)

下载本文
显示全文
专题