PHP实现路由映射到指定控制器
来源: 阅读:1058 次 日期:2016-08-29 14:29:38
温馨提示: 小编为您整理了“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']} 的文章列表";

 }

以上就是本文的全部内容,希望对大家的学习有所帮助

更多信息请查看网络编程
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:hfpxwx
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map