__root__是thinkphp模板中通过tpl_replace_string配置的静态文本替换变量,指向web根目录(如/myapp或/),非php常量root_path;需在template配置中手动设置['__root__' => root_path]并清除缓存生效。

ThinkPHP模板里怎么用ROOT常量引用根目录资源
ROOT常量在ThinkPHP中并不存在——这是个常见误解。模板里无法直接使用ROOT,因为该常量通常未被定义或未传递到视图层。真正可用的是__ROOT__(双下划线),它是框架自动注入的模板变量,指向应用的**Web根目录**(即public目录),不是项目根目录。
__ROOT__ 和 __PUBLIC__ 的区别与使用场景
这两个是ThinkPHP模板中实际生效的内置路径变量:
-
__ROOT__:等价于request()->root(),返回当前请求的URL根路径,例如/myapp(部署在子目录时)或/(部署在域名根下) -
__PUBLIC__:默认指向public/子目录,值为__ROOT__/public,但实际由配置app.public_path决定,可被修改 - 静态资源(JS/CSS/图片)应优先用
__PUBLIC__,因为它更稳定;而跳转链接、API前缀等需动态适配部署路径时用__ROOT__
为什么写<img src="/static/logo.png">有时会404
硬编码斜杠开头的路径(如/static/logo.png)会从域名根开始解析,一旦应用部署在子目录(如https://example.com/myapp/),浏览器就会错误地请求https://example.com/static/logo.png而非https://example.com/myapp/static/logo.png。
正确做法是:
- 用
__ROOT__/static/logo.png(适配子目录部署) - 或更推荐:
__PUBLIC__/static/logo.png(前提是static放在public/下) - 若
static在public外(如项目根下的static/),需手动配置app.public_path或改用绝对URL
自定义模板路径变量(比如想用__ASSET__)
如果项目结构复杂,需要统一管理CDN或多环境静态资源路径,不建议魔改__ROOT__,而应在控制器中显式赋值:
$this->assign('ASSET', config('app.asset_url') ?: '__PUBLIC__');
然后模板中用<script src="<?=%24ASSET?>/js/app.js"></script>。这样既能兼容本地开发(指向__PUBLIC__),也能一键切到CDN地址,且逻辑清晰、便于测试。
注意:不要在模板里拼接PHP常量(如<?php echo ROOT_PATH?>),那会破坏MVC分层,且ROOT_PATH是服务器文件路径,不能用于前端URL。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











