ThinkPHP 7 模板中 {:config('seo.title')} 返回 null 是因为 seo.php 未在 app.php 的 extra 中注册,导致配置未加载;正确做法是在控制器用 assign() 传入配置和变量,模板中用 str_replace() 替换占位符。

ThinkPHP 7 前端首页(模板)中不能直接用 PHP 的 config() 函数读取 SEO 配置,必须先在控制器 assign 过来,否则模板里 {:config('seo.title')} 会返回 null 或空字符串——因为 seo.php 默认不进自动加载列表,且未在 app.php 的 extra 中注册。
为什么模板里 config('seo.xxx') 不生效
ThinkPHP 7 的 config() 在模板中只能读取已加载的配置段(如 app、database),而自定义的 seo.php 文件不会被自动识别。即使你把文件放在 config/seo.php,若没在 config/app.php 的 'extra' => ['seo'] 中声明,框架启动时根本不会加载它。
-
config('seo.title')返回 null,不是语法错,是配置根本没加载 - 模板中写
{:config('seo.title')}等价于读一个不存在的键,结果为空 - 哪怕你手动
include了文件,也绕不过框架的配置合并与缓存机制
正确做法:控制器 assign + 模板 str_replace
沿用 ThinkPHP 官方推荐的占位符替换模式,避免在模板里做配置解析逻辑。核心是「控制器传变量,模板只做简单替换」。
- 在
config/seo.php定义结构:return ['title' => '{page_title} - {site_name}', 'description' => '{page_desc} | {site_name}']; - 在首页控制器(如
app\controller\Index.php)中:$this->assign('seo', config('seo'))->assign('page_title', '首页')->assign('page_desc', '欢迎访问我们的官网'); - 模板中不用
config(),改用str_replace替换:{:str_replace(['{page_title}', '{site_name}', '{page_desc}'], [$page_title, config('app.name'), $page_desc], $seo['title'])}
容易踩的坑:占位符漏传或拼错
只要有一个占位符没传值(比如忘了 assign('page_desc')),最终标题就会残留 {page_desc},搜索引擎抓取时显示异常。
立即学习“PHP免费学习笔记(深入)”;
-
$page_title必须非空,否则title标签内容开头就是破折号或空格 - 占位符名称要和
str_replace第一个数组完全一致:大小写、花括号、下划线都不能错 -
config('app.name')是安全的,但别写成config('APP_NAME')(大小写敏感) - 不要在模板里嵌套太多
{:...}表达式,可提前在控制器组装好$final_title再 assign
最稳妥的方式,是在控制器里一次性完成替换,再 assign 给模板,彻底避开模板层的字符串操作——尤其当 SEO 配置含多层嵌套或条件逻辑时,模板里根本不好维护。



















