zoukankan      html  css  js  c++  java
  • [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="
    ";
            }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);

    控制器啥样

    ControllerUserUser.php

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

    效果呢:

  • 相关阅读:
    字符串匹配的三种算法
    字符串匹配
    多少个矩形被覆盖
    指针和地址的区别
    股票开盘的最大成交额-----一道不错的贪心算法题目
    Z字形扫描矩阵
    第几次出现
    节日(CCF试题)
    数字排序
    JS对象添加新的字段
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5766938.html
Copyright © 2011-2022 走看看