ThinkPHP6 多应用模式下,我改了 `view_path` 却忘了 `view_depr`,子主题静态资源全跑回了主站目录

站长杂谈 14 浏览 0 回复 返回上级

上周给公司内网系统做多应用拆分,主站用默认配置,后台单独开了一个 `admin` 应用。想着资源隔离干净点,后台模板继承自一套独立的 `admin_base.html`,静态资源也打算走独立目录。

结果坑就来了。

我在 `config/admin/view.php` 里改了 `view_path` 指向 `../view/admin/`,模板能正常找到,喜滋滋以为完事。直到测试同事说后台样式全崩了,F12 一看,CSS 请求全打到了主站的 `/static/css/` 下面,404 一片红。

第一反应是 `__STATIC__` 别名配错了,翻 `config/view.php` 看了三遍,没问题啊。又怀疑是 CDN 配置覆盖了,把 `cdn` 数组注释掉,清缓存,重编译,纹丝不动。

最后是在 `vendor/topthink/framework/src/think/View.php` 里打日志,才发现模板编译后的路径解析走了 `view_depr` 这个配置。默认是 `/`,但我多应用目录结构里实际用的是 `DS` 分隔的相对路径,模板引擎在拼接继承路径时,把父模板的资源引用基准目录算到了主站 `view` 下,而不是我指定的 `admin` 子目录。

更隐蔽的是,这个 `view_depr` 在单应用模式下你根本感知不到,因为目录结构和配置默认是咬合的。一旦多应用 + 自定义 `view_path`,它就成了那个沉默的刺客。

修复倒是一行代码:`view_depr' => DIRECTORY_SEPARATOR,`,但定位过程花了两个多小时。期间我还怀疑过是不是 `template` 驱动的 `tpl_replace_string` 优先级问题,甚至把 `__STATIC__` 的替换规则重写了一遍,完全是打空气。

事后复盘,ThinkPHP 的视图配置里有三个容易混淆的概念:模板查找路径(`view_path`)、模板继承解析分隔符(`view_depr`)、静态资源发布别名(`tpl_replace_string`)。它们分别管"去哪找文件""怎么拼路径""输出时替换成什么",三个环节独立运转,任一环节和实际目录结构对不上,资源就会迷路。

我现在多应用项目里会强制写一个 `view.php` 的注释头,把这三个配置的当前值和目录实际结构对应关系写清楚。不然三个月后再来改,大概率又要踩一遍。

有没有同样在多应用模式下被视图路径折腾过的?你们是怎么做各应用资源隔离的,独立域名、路径前缀,还是干脆上构建工具打包?

评论0
回复 · 0
还没有回复
微信客服 微信客服