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

前端技术 2023/09/07 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\']} 的文章列表\";
 }
} 

效果呢:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持phpstudy。

本文地址:https://www.stayed.cn/item/19713

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。