[top-think/think]配置自动转换URL的问题

2023-12-27 760 views
4

TP5中默认开启了URL的自动转换

'url_controller_convert' => true, 'url_action_convert' => true,

但是核心程序App.php在判断时直接采用strtolower,而不是Loader::parseName。见: 215行:define('CONTROLLER_NAME', Config::get('url_controller_convert') ? strtolower($controllerName) : $controllerName);

导致了无法加载驼峰法命名的Controller 如 site/module/CdKey依当前的代码会被解析为Cdkey而非CdKey

同时如果按上面的修改之后,View层拉取模板时,因为直接使用了CONTROLLER_NAME,所以视图的目录又需要是c格式的如site/module/cd_key,否则只能改一下View->parseTemplate方法。

有没有更好的解决方案? 或者是我使用的方式不对?

回答

4

你关闭自动转换 不就可以使用驼峰法了

4

是可以,但是view的目录也要使用驼峰了,与目录命名全小写冲突,这是潜规则吗,你们不认为这是个bug吗?

发自我的小米手机在 ThinkPHP notifications@github.com,2016年3月3日 下午8:27写道:你关闭自动转换 不就可以使用驼峰法了

—Reply to this email directly or view it on GitHub.

3

我也没明白为什么这里获取controller是变小写,而url生成时是转成C格式。要是碰上上面说的CdKey这样的controller,是不是两边就不一致了?

4

@LoveLingEr 默认规范就是转小写 你要关闭转换 就要自己控制视图目录了 @hugtale 转小写是为了不区分url大小写 关闭转换后就是遵循原来的URL

1

感觉这个问题以后也会成为大家的吐槽点

0

这个问题的起因

  1. 开启自动转换,驼峰法命名的Controller无法自动加载
  2. 关闭自动转换,驼峰法命名的Controller的视图路径需要自己处理
  3. 系统默认开启了自动转换,不容易发现(文档无说明)

发起issue的想法并不是因为无法解决,而是希望官方可以优化一下自动转换的功能,避免其他人出现相同的困惑。

附一下目前我的解决方法:

  1. App.php 中修改CONTROLLER_NAME的转换方法,由strtolower变成Loader::parseName
  2. View.php中修改parseTemplate,判断如果未启用自动转换,CONTROLLER_NAME需要使用Loader::parseName转换为C风格
  3. 由此引起的潜规则: a. 开启自动转换后,URL可以为驼峰法或C风格,View目录统一变成C风格(目录全小写) b. 关闭自动转换后,URL必须为驼峰法,View目录统一变成C风格(为了使目录全小写) 【注】也就是View目录无论是否开启,都统一使用C风格。
4

关闭自动转换的话,其实controller可以是驼峰法,也可以是C风格的,因为最终实例化控制器对象之前还是以驼峰法为准的。详见 \think\Loader::controller 方法。