如何制作简单的模板?

时间:2019-03-21 15:14:09

标签: php templates

注意:这是关于纯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我不知道如何设置它,因为它是在页面内容之前呈现的,并且我不想通过控制器发送页面标题(这将是一种反模式)。

1 个答案:

答案 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>