[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/12592.html

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

相关推荐

发表回复

登录后才能评论