一个简单的php mvc框架 的 代码说明,/project/model/route.php uri路由处理的重要组成部分:
/project/model/route.php
<?php
//当配置好__autoload后,直接Model_Route:get($uri)即可调用
class Model_Route {
protected static $_instance = null;
public static function instance(){
if(self::$_instance == null){
self::$_instance = new self();
}
return self::$_instance;
}
/*
* 根据配置的route规则(如:/project/application_www/route.php),
* 从 uri 解析出 controller name、action name、params
* 因为要伪静态嘛,所以写了这个,纯属兴致。不过,还挺好用。
*/
public static function get($uri){
global $_route;
$return = array();
foreach($_route as $v){
$has_params = preg_match_all('/\<(.*?)\>/',$v['url'],$m);
$pattern = str_replace(array('?','(',')'),array('\?','(:?','){0,1}'),$v['url']);
if($has_params){
$param_keys = $m[1];
foreach($param_keys as $p_k){
$p_t = $v['params']['pattern']["{$p_k}"];
$s_p = "(?P<{$p_k}>{$p_t}?)";
$pattern = str_replace("<{$p_k}>",$s_p,$pattern);
}
}
$pattern = str_replace(array('/','.'),array('\\/','\\.'),$pattern);
$uri = preg_replace('/\?.*?$/','',$uri);
$is_match = preg_match('/^'.$pattern.'$/',$uri,$matches);
if($is_match){
$return['controller'] = $v['controller'];
$return['action'] = $v['action'];
if(isset($v['params'])){
foreach($v['params']['default'] as $p_k => $p_v){
if(isset($matches["{$p_k}"])){
$return['params']["{$p_k}"] = $matches["{$p_k}"];
}
else{
$return['params']["{$p_k}"] = $p_v;
}
}
}
if(isset($v['html'])){
$return['html'] = $v['html'];
}
break;
}
}
return $return;
}
/*
* 这个method是和上面的相反的过程,根据配置的route规则,
* 输入contrller name、action name,$params,得到uri。
* 但这种情况很少碰到,一个uri定下来,就基本不会改了,
* 为什么不直接写uri,却要调用method?直接写uri好了。
* 空着!
*/
public static function uri($controller,$action,array $params){
}
}