[PHP] 实现路由映射到指定控制器详解编程语言

自定义路由的功能,指定到pathinfo的url上,再次升级之前的脚本

SimpleLoader.php

<?php 
class SimpleLoader{ 
    public static function run($rules=array()){ 
        header("content-type:text/html;charset=utf-8"); 
        self::register(); 
        self::commandLine(); 
        self::router($rules); 
        self::pathInfo(); 
    } 
    //自动加载 
    public static function loadClass($class){ 
        $class=str_replace('//', '/', $class); 
        $dir=str_replace('//', '/', __DIR__); 
        $class=$dir."/".$class.".php"; 
        if(!file_exists($class)){ 
            header("HTTP/1.1 404 Not Found"); 
        } 
        require_once $class;         
    } 
    //命令行模式 
    public static function commandLine(){ 
        if(php_sapi_name()=="cli"){ 
            $_SERVER['PATH_INFO']=""; 
            foreach ($_SERVER['argv'] as $k=>$v) { 
                if($k==0) continue; 
                $_SERVER['PATH_INFO'].="/".$v; 
            } 
        } 
    } 
    //路由模式 
    public static function router($rules){ 
        if(isset($_SERVER['PATH_INFO']) && !empty($rules)){ 
            $pathInfo=ltrim($_SERVER['PATH_INFO'],"/"); 
            foreach ($rules as $k=>$v) { 
                $reg="/".$k."/i"; 
                if(preg_match($reg,$pathInfo)){ 
                    $res=preg_replace($reg,$v,$pathInfo); 
                    $_SERVER['PATH_INFO']='/'.$res; 
                } 
            } 
        } 
    } 
    //pathinfo处理 
    public static function pathInfo(){ 
        if(isset($_SERVER['PATH_INFO'])){ 
            $pathinfo=array_filter(explode("/", $_SERVER['PATH_INFO'])); 
            for($i=1;$i<=count($pathinfo);$i++){ 
                $key=isset($pathinfo[$i]) ? $pathinfo[$i] : ''; 
                $value=isset($pathinfo[$i+1]) ? $pathinfo[$i+1] :""; 
                switch ($i) { 
                    case 1: 
                        $_GET['m']=ucfirst($key); 
                        break; 
                    case 2: 
                        $_GET['c']=ucfirst($key); 
                        break; 
                    case 3: 
                        $_GET['a']=$key; 
                        break; 
                    default: 
                        if($i>3){ 
                            if($i%2==0){ 
                                $_GET[$key]=$value; 
                            } 
                        } 
                        break; 
                } 
            } 
        } 
        $_GET['m']=!empty($_GET['m']) ? ucfirst($_GET['m']) : 'Index'; 
        $_GET['c']=!empty($_GET['c']) ? ucfirst($_GET['c']) : 'Index'; 
        $_GET['a']=!empty($_GET['a']) ? $_GET['a'] : 'index'; 
        $class="//Controller//{$_GET['m']}//{$_GET['c']}"; 
        $controller=new $class; 
        if(method_exists($controller, $_GET['a'])){ 
            $controller=new $class; 
            $controller->$_GET['a'](); 
        }else{ 
            header("HTTP/1.1 404 Not Found"); 
            echo "404"; 
        } 
    } 
    //致命错误回调 
    public static function shutdownCallback(){ 
        $e=error_get_last(); 
        if(!$e) return; 
        self::myErrorHandler($e['type'],'<font color="red">Fatal Error</font> '.$e['message'],$e['file'],$e['line']); 
    } 
    //错误处理 
    protected static function myErrorHandler($errno,$errstr,$errfile,$errline){ 
        list($micseconds,$seconds)=explode(" ",microtime()); 
        $micseconds=round($micseconds*1000); 
        $micseconds=strlen($micseconds)==1 ? '0'.$micseconds : $micseconds; 
        if(php_sapi_name()=="cli"){ 
            $break="/r/n"; 
        }else{ 
            $break="<br/>"; 
        } 
        $mes="[".date("Y-m-d H:i:s",$seconds).":{$micseconds}] ".$errfile." ".$errline." line ".$errstr.$break; 
        echo $mes;         
    } 
    //注册 
    public static function register(){ 
        error_reporting(0); 
        set_error_handler(function($errno,$errstr,$errfile,$errline){ 
            self::myErrorHandler($errno,$errstr,$errfile,$errline); 
        }); 
        register_shutdown_function(function(){ 
            self::shutdownCallback(); 
        }); 
        spl_autoload_register("self::loadClass"); 
    } 
}

如何使用

index.php

<?php 
//路由映射 
$rules=array( 
    '^user$'=>'User/User/getUserList', 
    '^user//(/d+)$'=>'User/User/getUserById/id/$1', 
    '^user//(/d+)//article$'=>'User/User/getUserArticle/uid/$1' 
); 
require_once "SimpleLoader.php"; 
SimpleLoader::run($rules);

控制器啥样

/Controller/User/User.php

<?php 
namespace Controller/User; 
 
class User{ 
    public function getUserById(){ 
        echo "用户信息id {$_GET['id']} 的信息"; 
    } 
    public function getUserList(){ 
        echo "用户列表"; 
    } 
    public function getUserArticle(){ 
        echo "用户id {$_GET['uid']} 的文章列表"; 
    } 
}

效果呢:

[PHP] 实现路由映射到指定控制器详解编程语言

[PHP] 实现路由映射到指定控制器详解编程语言[PHP] 实现路由映射到指定控制器详解编程语言

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/industrynews/12592.html

(0)
上一篇 2021年7月19日 14:44
下一篇 2021年7月19日 14:44

相关推荐

发表回复

登录后才能评论