PHP实现路由映射到指定控制器

5年以前  |  阅读数:320 次  |  编程语言: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分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例