
本文介绍在 PHP MVC 模式下,如何通过控制器统一传递页面标识(如 'home'、'contact')至共享 Header 模板,并在 或其他标签中动态渲染,避免重复代码且保持结构清晰。
本文介绍在 php mvc 模式下,如何通过控制器统一传递页面标识(如 'home'、'contact')至共享 header 模板,并在 `
在典型的 MVC 结构中,Header 作为复用视图(如 views/share-base/header.php)被多个页面包含,但它本身无法直接访问当前页面的上下文信息(如页面名称)。若直接在视图中调用 model::nametag('home'),不仅破坏了 MVC 的职责分离原则(视图不应主动调用模型获取数据),还导致逻辑分散、难以维护。
✅ 正确做法是:由控制器统一准备数据 → 透传至视图 → 在 Header 中安全使用。
1. 修改控制器:将页面标识作为 $data 传入视图
在 Controller::view() 方法中,确保 $data 参数能被 Header 访问。例如,在首页控制器中:
// controllers/home.php
class HomeController extends Controller {
public function index() {
$this->view('home', ['page_title' => '首页', 'page_keyword' => 'home']);
}
}同理,联系页可传:
$this->view('contact', ['page_title' => '联系我们', 'page_keyword' => 'contact']);2. 更新 Header 模板:安全读取并渲染 $data
修改 views/share-base/header.php,利用 PHP 变量解析(注意防御性判断):
<!DOCTYPE html>
<html lang="en">
<head>
<base href="<?= defined('URL') ? URL : '/' ?>">
<meta charset="utf-8">
<title><?= htmlspecialchars($data['page_title'] ?? '默认标题', ENT_QUOTES, 'UTF-8') ?></title>
<meta name="keywords" content="<?= htmlspecialchars($data['page_keyword'] ?? '', ENT_QUOTES, 'UTF-8') ?>">
</head>
<body id="page-top">✅ 关键点:
- 使用
??运算符提供默认值,防止未定义索引报错;- 使用
htmlspecialchars()防止 XSS 攻击(尤其当标题含用户输入时);- 不建议在 Header 中直接调用
model::nametag()—— 这会绕过控制器,使数据流不可控,且违反单一数据源原则。
3. (可选)增强健壮性:在 view() 方法中预设默认值
可在 Controller::view() 内部补充兜底逻辑:
function view($viewurl, $data = [], $noincludeheader = '', $noincludefooter = '') {
// 默认标题与关键词
$data += [
'page_title' => '我的网站',
'page_keyword' => 'default'
];
if ($noincludeheader === '') {
require_once 'views/share-base/header.php';
}
require_once 'views/' . $viewurl . '.php';
if ($noincludefooter === '') {
require_once 'views/share-base/footer.php';
}
}总结
- ❌ 错误方式:在视图或 Header 中直接调用静态模型方法传参(如
model::nametag('home')),导致逻辑耦合、测试困难、安全性缺失; - ✅ 推荐方式:控制器负责“准备数据”,视图负责“展示数据”,Header 作为子视图自然继承
$data; - 安全第一:所有输出到 HTML 的动态内容必须经过
htmlspecialchars()转义; - 可扩展性:后续如需 SEO 描述、Open Graph 标签等,只需扩展
$data数组并在 Header 中对应渲染即可。
此方案符合 MVC 分层规范,提升代码可维护性与安全性,适用于中小型 PHP 应用快速迭代场景。

















