TP的module支持中文

20 篇文章 0 订阅
為了讓URL支持中文,例如www.xxx.com/廣州/xx 需要在emptyAction中處理捕獲到的廣州/xxxx。但是TP默認的module名稱是不支持中文的。因此需要修改TP框架的PHP核心文件:
App.class.php
修改後的代碼:

/**
* 执行应用程序
* @access public
* @return void
*/
static public function exec() {
if(!preg_match('/^[A-Za-z](\w)*$/',MODULE_NAME) ){ // 安全检测
$module = false;
}else{

//创建Action控制器实例
$group = defined('GROUP_NAME') && C('APP_GROUP_MODE')==0 ? GROUP_NAME.'/' : '';
//$module = A($group.MODULE_NAME);


if(preg_match("/[\x7f-\xff]/", MODULE_NAME)){//中文模式
if(in_array(MODULE_NAME,C('CHINESE_MODULE_NAME'))){ //在指定的中文內
$module = A($group.'isTheEmpty');
}else{
_404(L('_MODULE_NOT_EXIST_').':'.MODULE_NAME);
}
}else{
$module = A($group.MODULE_NAME);
}
}

if(!$module) {

if('4e5e5d7364f443e28fbf0d3ae744a59a' == MODULE_NAME) {
header("Content-type:image/png");
exit(base64_decode(App::logo()));
}
if(function_exists('__hack_module')) {
// hack 方式定义扩展模块 返回Action对象
$module = __hack_module();
if(!is_object($module)) {
// 不再继续执行 直接返回
return ;
}
}else{
// 是否定义Empty模块
$module = A($group.'Empty');
if(!$module){
_404(L('_MODULE_NOT_EXIST_').':'.MODULE_NAME);
}
}
}
// 获取当前操作名 支持动态路由
$action = C('ACTION_NAME')?C('ACTION_NAME'):ACTION_NAME;
$action .= C('ACTION_SUFFIX');
try{
if(!preg_match('/^[A-Za-z](\w)*$/',$action)){
// 非法操作
throw new ReflectionException();
}
//执行当前操作
$method = new ReflectionMethod($module, $action);
if($method->isPublic()) {
$class = new ReflectionClass($module);
// 前置操作
if($class->hasMethod('_before_'.$action)) {
$before = $class->getMethod('_before_'.$action);
if($before->isPublic()) {
$before->invoke($module);
}
}
// URL参数绑定检测
if(C('URL_PARAMS_BIND') && $method->getNumberOfParameters()>0){
switch($_SERVER['REQUEST_METHOD']) {
case 'POST':
$vars = array_merge($_GET,$_POST);
break;
case 'PUT':
parse_str(file_get_contents('php://input'), $vars);
break;
default:
$vars = $_GET;
}
$params = $method->getParameters();
foreach ($params as $param){
$name = $param->getName();
if(isset($vars[$name])) {
$args[] = $vars[$name];
}elseif($param->isDefaultValueAvailable()){
$args[] = $param->getDefaultValue();
}else{
throw_exception(L('_PARAM_ERROR_').':'.$name);
}
}
$method->invokeArgs($module,$args);
}else{
$method->invoke($module);
}
// 后置操作
if($class->hasMethod('_after_'.$action)) {
$after = $class->getMethod('_after_'.$action);
if($after->isPublic()) {
$after->invoke($module);
}
}
}else{
// 操作方法不是Public 抛出异常
throw new ReflectionException();
}
} catch (ReflectionException $e) {
// 方法调用发生异常后 引导到__call方法处理
$method = new ReflectionMethod($module,'__call');
$method->invokeArgs($module,array($action,''));
}
return ;
}



將需要支持的中文module名稱添加到config.php CHINESE_MODULE_NAME 配置數組中

這樣就能支持中文URL解析了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值