框架url解析
来源:互联网 发布:常用mysql语句大全 编辑:程序博客网 时间:2024/06/05 06:32
<?php/***url解析分发类**/class Route{ private $_module;private $_controller;private $_action;private $_requestParam = array();private $_rules = array(); public function __construct(){ $this->_module = '';$this->_controller = C('defaultController');$this->_action = C('defaultAction');$this->_rules = C('urlManager=>rules');} /***获取模型名称**/public function getModule(){return $this->_module;} /***获取控制器名称**/public function getController(){return $this->_controller;} /***获取动作名称**/public function getAction(){return $this->_action;} /***设置请求参数数组,解析二级域名**/ private function parse(){//先检查二级域名$modules = C('modules');if($modules) //只有设置了模块才检查{$host = $_SERVER['HTTP_HOST'];if(C('domain') && $pos = strpos($host,C('domain'))){$preffix = substr($host,0,$pos-1);if($pos = strrpos($preffix,'.')){$preffix = substr($preffix,$pos);}if(in_array($preffix,$modules)){$this->_module = $preffix;}}}} /*** 解析普通参数**/private function parseParam($controllerObj){$num=count($this->_requestParam);if($num == 0)return;for($i=0,$num=count($this->_requestParam);$i<$num;$i+=2){ $controllerObj->setParam($this->_requestParam[$i],$this->_requestParam[$i+1]);}} /*** url解析规则* 1. 'variable/varialbe:regexp>'=>'controller/action',* 2. 'variable/variable'=>'controller/action',* 3. 'variable/variable/:varialbe|regexp'=>'controller/action',* 4. 'variable/:variable|regexp/varialbe'=>'controller/action',* 5. 'variable/variable/*'=>'controller/action',* desc :开头的是变量,|后面的正则是变量匹配类型,如果没有,则是任意变量**/private function rule(){$parseParam = array();$requestParamNum = count($this->_requestParam);foreach($this->_rules as $rule=>$path){$ruleParam = explode('/',$rule);$ruleParamNum = count($ruleParam); if(($ruleParam[$ruleParamNum-1] == '*' && $requestParamNum >= $ruleParamNum-1) || $requestParamNum == $ruleParamNum)//rule满足初始条件{ foreach($ruleParam as $key=>$value){if($value == '*'){break;}if(substr($value,0,1) == ':'){$value = substr($value,1); if(strpos($value,'|')) { list($value,$regexp)=explode('|',$value); if(!preg_match("/$regexp/",$this->_requestParam[$key])) { $parseParam = array(); break; } } $parseParam[] = $value; //参数名 $parseParam[] = $this->_requestParam[$key]; //参数值}else if(strcasecmp($value,$this->_requestParam[$key])){ $parseParam = array(); break;}}if($parseParam){$pathParam = explode('/',$path);break;}}} if($parseParam && $key == $ruleParamNum-1) //匹配了{if($ruleParam[$ruleParamNum-1] == '*' && $requestParamNum >= $ruleParamNum){ for(;$key<$requestParamNum;$key++) $parseParam[] = $this->_requestParam[$key];} $this->_requestParam = array_merge($pathParam,$parseParam);unset($parseParam);}} /*** 执行控制器方法**/public function run(){$this->parse(); if($_SERVER['REQUEST_URI']) {$this->_requestParam = explode('/',trim($_SERVER['REQUEST_URI'],'/'));if($this->_rules)//存在路由规则{$this->rule(); //本次请求满足路由规则}if($modules && $this->_module == '' && in_array($this->_requestParam[0],$modules)){$this->_module = $this->_requestParam[0];array_shift($this->_requestParam);}//print_r($this->_requestParam);$controllerPath = APP_PATH.DS.($this->_module?'modules'.DS.$this->_module.DS:'').'controllers'.DS;if(file_exists($controllerPath.$this->_requestParam[0].'Controller.class.php')){ $this->_controller = $this->_requestParam[0];array_shift($this->_requestParam);}} $controllerClass = $this->_controller.'Controller'; import($controllerClass,$controllerPath,'class');$controllerObj = new $controllerClass($this); $this->_requestParam[0]; if($this->_requestParam[0] && method_exists($controllerObj,$this->_requestParam[0].'Action')){ $this->_action = $this->_requestParam[0];array_shift($this->_requestParam);}$this->parseParam($controllerObj); //对象时引用方式 try{$action = $this->_action.'Action'; $controllerObj->$action();}catch(Exception $e){$this->rediretUrl('/');}} /*** url重定向**/public function rediret($url){header('location:'.$url);} /*** 生成url方法,需要逆解析rule规则**/public function url($controller,$action,$param,$module = ''){ $urlPath = $controller.'/'.$action;if($module) $urlPath = $module .'/'. $urlPath;$parseParam = array();if($this->_rules){$ruleArr = array(); foreach($this->_rules as $rule=>$path){if($path == $urlPath){$ruleArr[] = $rule;}}if($ruleArr){foreach($ruleArr as $rule){ $ruleParam = explode('/',$rule);foreach($ruleParam as $key=>$value){if(substr($value,0,1) == ':'){ $value = substr($value,1);if(strpos($value,'|')){ list($value,$regexp)=explode('|',$value);}else{$regexp = '';}if(isset($param[$value]) && (!$regexp || preg_match("/$regexp/",$param[$value]))){ $parseParam[] = $param[$value];unset($param[$value]);}else{ $parseParam = array();break;}}else{$parseParam[] = $value;}}if($parseParam)break;} //foreach($ruleArr as $rule)if($parseParam) $urlPath = implode('/',$parseParam);} //if($ruleArr)} //if($this->_rules)if($param){foreach($param as $key=>$value){ $urlPath .= '/'.$key.'/'.$value;}}return $urlPath;}}
0 0
- 框架url解析
- URL解析与CI框架URL
- ThinkPHP框架系统源码解析——URL路由解析
- 解析url
- URL解析
- URL解析
- 解析URL
- url解析
- url解析
- url解析
- 解析url
- 解析URL
- 解析url
- url解析
- 解析url
- url解析
- URL解析
- 解析URL
- session超时设置
- vim 替换命令
- Akka 2.1尝试的一个小例子
- cocos2dx游戏任务系统开发之服务端数据库
- hibernate监听器的配置,在spring中
- 框架url解析
- 考研英语单词5——81-100
- 今日开源介绍:Google Guava、Google Guice、Joda-Time
- ios的手势操作之UIGestureRecognizer浅析
- 采样问题
- POJ 1006 生理周期(中国剩余定理)
- 【LeetCode从零单刷】Unique Binary Search Trees I & II
- poj 3425 Customer support 模拟
- JSON