PHP實現(xiàn)路由映射到指定控制器
來源:易賢網(wǎng) 閱讀:1106 次 日期:2016-08-29 14:29:38
溫馨提示:易賢網(wǎng)小編為您整理了“PHP實現(xiàn)路由映射到指定控制器”,方便廣大網(wǎng)友查閱!

自定義路由的功能,指定到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";

 }

 }

 //致命錯誤回調(diào)

 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']} 的文章列表";

 }

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助

更多信息請查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機網(wǎng)站地址:PHP實現(xiàn)路由映射到指定控制器
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
聯(lián)系電話:0871-65317125(9:00—18:00) 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)