注意:这是关于纯PHP的,我正在尝试以一种更简单和琐碎的方式复制Laravel对Blade模板引擎所做的工作。
如果我在layout.php
中进行如下简单布局:
请注意pageTitle变量以及应在何处显示内容
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title><?php $pageTitle ?? ''; ?></title>
</head>
<body>
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
HERE I WANT TO LOAD MY CONTENT
</body>
</html>
我无法理解的是当我想显示一个使用此布局的简单页面时如何“插入”内容并显示pageTitle。例如:
<?php require(app_views_path().'/layouts/app.view.php'); ?>
<?php $pageTitle = 'Welcome'; ?>
<h1>Welcome Page</h1>
,现在应该包含此标签,并在打开页面时设置$pageTitle
变量。
如何产生这种情况?
我自己管理的只是包裹页面内容,然后将布局分为_head和_foot部分,因此看起来像这样:
<?php require(app_views_path().'/layouts/_partials/_head.view.php'); ?>
<h1>Welcome Page</h1>
<?php require(app_views_path().'/layouts/_partials/_foot.view.php'); ?>
但是$pageTitle
我不知道如何设置它,因为它是在页面内容之前呈现的,并且我不想通过控制器发送页面标题(这将是一种反模式)。
答案 0 :(得分:1)
我建议将其包装在函数中。
<?php
function load_view($view, $data = []) {
extract($data);
require(app_views_path() . $view . ".view.php");
}
您可以这样称呼它:
data = ["pageTitle" => "Welcome"];
load_view("layouts/app", $data);
然后,在您的视图中,您还需要回显某些内容,而原来的内容却不是:
<title><?=$pageTitle ?? ''?></title>