cari
Rumahphp教程php手册[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(&#39;\\&#39;, &#39;/&#39;, $class);
        $dir=str_replace(&#39;\\&#39;, &#39;/&#39;, __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[&#39;PATH_INFO&#39;]="";
            foreach ($_SERVER[&#39;argv&#39;] as $k=>$v) {
                if($k==0) continue;
                $_SERVER[&#39;PATH_INFO&#39;].="/".$v;
            }
        }
    }
    //路由模式
    public static function router($rules){
        if(isset($_SERVER[&#39;PATH_INFO&#39;]) && !empty($rules)){
            $pathInfo=ltrim($_SERVER[&#39;PATH_INFO&#39;],"/");
            foreach ($rules as $k=>$v) {
                $reg="/".$k."/i";
                if(preg_match($reg,$pathInfo)){
                    $res=preg_replace($reg,$v,$pathInfo);
                    $_SERVER[&#39;PATH_INFO&#39;]=&#39;/&#39;.$res;
                }
            }
        }
    }
    //pathinfo处理
    public static function pathInfo(){
        if(isset($_SERVER[&#39;PATH_INFO&#39;])){
            $pathinfo=array_filter(explode("/", $_SERVER[&#39;PATH_INFO&#39;]));
            for($i=1;$i<=count($pathinfo);$i++){
                $key=isset($pathinfo[$i]) ? $pathinfo[$i] : &#39;&#39;;
                $value=isset($pathinfo[$i+1]) ? $pathinfo[$i+1] :"";
                switch ($i) {
                    case 1:
                        $_GET[&#39;m&#39;]=ucfirst($key);
                        break;
                    case 2:
                        $_GET[&#39;c&#39;]=ucfirst($key);
                        break;
                    case 3:
                        $_GET[&#39;a&#39;]=$key;
                        break;
                    default:
                        if($i>3){
                            if($i%2==0){
                                $_GET[$key]=$value;
                            }
                        }
                        break;
                }
            }
        }
        $_GET[&#39;m&#39;]=!empty($_GET[&#39;m&#39;]) ? ucfirst($_GET[&#39;m&#39;]) : &#39;Index&#39;;
        $_GET[&#39;c&#39;]=!empty($_GET[&#39;c&#39;]) ? ucfirst($_GET[&#39;c&#39;]) : &#39;Index&#39;;
        $_GET[&#39;a&#39;]=!empty($_GET[&#39;a&#39;]) ? $_GET[&#39;a&#39;] : &#39;index&#39;;
        $class="\\Controller\\{$_GET[&#39;m&#39;]}\\{$_GET[&#39;c&#39;]}";
        $controller=new $class;
        if(method_exists($controller, $_GET[&#39;a&#39;])){
            $controller=new $class;
            $controller->$_GET[&#39;a&#39;]();
        }else{
            header("HTTP/1.1 404 Not Found");
            echo "404";
        }
    }
    //致命错误回调
    public static function shutdownCallback(){
        $e=error_get_last();
        if(!$e) return;
        self::myErrorHandler($e[&#39;type&#39;],&#39;<font color="red">Fatal Error</font> &#39;.
        $e[&#39;message&#39;],$e[&#39;file&#39;],$e[&#39;line&#39;]);
    }
    //错误处理
    protected static function myErrorHandler($errno,$errstr,$errfile,$errline){
        list($micseconds,$seconds)=explode(" ",microtime());
        $micseconds=round($micseconds*1000);
        $micseconds=strlen($micseconds)==1 ? &#39;0&#39;.$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(
    &#39;^user$&#39;=>&#39;User/User/getUserList&#39;,
    &#39;^user\/(\d+)$&#39;=>&#39;User/User/getUserById/id/$1&#39;,
    &#39;^user\/(\d+)\/article$&#39;=>&#39;User/User/getUserArticle/uid/$1&#39;
);
require_once "SimpleLoader.php";
SimpleLoader::run($rules);

控制器啥样

\Controller\User\User.php

<?php
namespace Controller\User;

class User{
    public function getUserById(){
        echo "用户信息id {$_GET[&#39;id&#39;]} 的信息";
    }
    public function getUserList(){
        echo "用户列表";
    }
    public function getUserArticle(){
        echo "用户id {$_GET[&#39;uid&#39;]} 的文章列表";
    }
}


效果呢:


以上就是[PHP] 实现路由映射到指定控制器的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

Dreamweaver Mac版

Dreamweaver Mac版

Alat pembangunan web visual

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini