PHP之MVC框架路由类实现

PHP之MVC框架路由类实现

PHP技巧Git开源网2020-01-12 20:31:0585A+A-

一、

PHP从零开始打造自己的MVC框架之路由类实现方法,具体如下:

在core目录下,新建一个名为lib的子目录,然后把我们前面写个route.php这个文件移动到这个目录下。

因为route类文件路径修改,所以在实例化的时候:

new \core\lib\route();

然后我们来完善route.php:

<?php
namespace core\lib;
class Route
{
  public $controller; // 控制器
  public $action; // 方法(动作)
  public function __construct()
  {
    // xxx.com/index.php/index/index
    // xxx.com/index.php/index
    /*
     * 1.隐藏index.php
     * 2.获取URL 参数部分
     * 3.返回对应控制器和方法
     * */
    if(isset($_SERVER['REQUEST_URI']) && $_SERVER['REQUEST_URI'] != '/'){
      // 处理成这种格式:index/index
      $path = $_SERVER['REQUEST_URI'];
      $pathArr = explode('/',trim($path,'/'));
      if(isset($pathArr[0])){
        $this->controller = $pathArr[0];
      }
      unset($pathArr[0]);
      if(isset($pathArr[1])){
        $this->action = $pathArr[1];
        unset($pathArr[1]);
      }else{
        $this->action = 'index';
      }
      // url多余部分(参数部分)转换成 GET
      // id/1/str/2
      $count = count($pathArr) + 2;
      $i = 2;
      while($i < $count){
        if(isset($pathArr[$i + 1])){
          $_GET[$pathArr[$i]] == $pathArr[$i + 1];
        }
        $i = $i + 2;
      }
      p($_GET); // 打印GET
    }else{
      $this->controller = 'index'; // 默认控制器
      $this->action = 'index'; // 默认方法
    }
  }
}

二、

在PHP中,利用单一入口文件实现路径的访问,实现形如 http://localhost/project/index.php/module/method/param_key/param_val 的访问路由

module:模块名称(类)

method:模块方法

param_key:参数名称

param_val:参数值

一、新建项目 route

在 route 下新 index.php,代码如下

<?php 
	error_reporting(0);  
	define(DIR_CONTROLLER, 'controller/'); // 定义控制器目录
	date_default_timezone_set("Asia/Shanghai");  
	$_DocumentPath = $_SERVER['DOCUMENT_ROOT'];  
	$_RequestUri = $_SERVER['REQUEST_URI'];  
	$_UrlPath = $_RequestUri;  
	$_FilePath = __FILE__;  
	$_AppPath = str_replace($_DocumentPath, '', $_FilePath);    //==>\route\index.php  
	$_AppPathArr = explode(DIRECTORY_SEPARATOR, $_AppPath);  
	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'] = ucfirst($_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 = DIR_CONTROLLER.$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($arr_url['parms']);   
            }  
        }        
    } else {  
        die("定义的模块不存在");  
    }  
?>

二、在项目目录下新建 controller 文件夹,并在该文件夹下新建 Welcome.class.php 文件,代码如下

<?php 
	class Welcome{
		public function index($param){
			echo 'Hello World!';
		}
	}
?>

三、地址栏输入 http://localhost/route/index.php/welcome/index/

页面输出 “ Hello World! ”


点击这里复制本文地址 以上内容由Git开源网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

支持Ctrl+Enter提交

Git开源网_git开源代码资源网_git开源博客 © All Rights Reserved.  
文章中出现的商标及图像版权属于其合法持有人,只供传递信息之用,非商务用途。本站所上传资源,只用于交流学习所用。本站资源收集于网络以及网友投稿,其版权归原创者所有,如有侵害到你的权益,或有不妥之处,请联系我们删除,敬请谅解。Email:admin#gitoscc.com(#更换成@)
Copyright © Git开源网 All rights reserved. 黑ICP备18006154号-1 由ZBlog驱动

网站管理