使用普通PHP进行模板继承

时间:2016-10-20 02:25:56

标签: php

我正在构建一个小型MVC应用程序,我想提供从基础(即父级)模板继承的网页。所以,我已经创建了一个View.php类来初始化模板:

<?php

class View {

    protected $path = $_SERVER['DOCUMENT_ROOT'] . "views/";

    protected $data;

    public function __construct() { $this->data = array(); }

    public function render($view) {
        if ( file_exists($this->path.$view) )
            include $this->path.$view;
    }

    public function __set($name, $value) { $this->data[$name] = $value; }

    public function __get($name) { return $this->data[$name]; }
}

要加载独立模板,我可以从routes.php执行以下操作:

$v = new View();
$v->people = ["josh", "alex", "michel"];
$v->render('welcome.php');

welcome.php本身就是:

<!DOCTYPE html>
<html lang="en">
<head></head>
<body>
    <?php print_r($this->people) ?>
</body>
</html>

问题

这适用于独立网页。我想要做的是实现模板继承(就像在Twig或Blade中一样),以便welcome.php可以从app.php继承。这就是我想象的:

app.php(父母)

<!DOCTYPE html>
<html lang="en">
<head></head>
<body>
    <header>...</header>
    <?php ***include('content')*** ?>
    <footer>...</footer>
</body>
</html>

welcome.php(孩子)

<?php ***extends('app.php')*** ?>

<?php ***block('content')*** ?>
    <h1>You made it to welcome.php!</h1>
<?php ***END block('content')*** ?>

我该怎么做?

2 个答案:

答案 0 :(得分:0)

很快:你不能仅仅通过包含php文件来做到这一点。

对于必须解析模板的支持,请构建模板结构。查找所有控制块并按语句执行语句。

一旦有了模板结构,就很容易覆盖模板的任何部分。

答案 1 :(得分:0)

对于那些感兴趣的人,我能够使用this tutorial来近似模板继承。它允许将变量绑定到父模板和子模板,但不允许在单个子模板中覆盖多个块。因此,您无法真正拥有内容,样式和脚本的部分;你只能容纳内容;否则,您需要包含其他PHP文件的标记。我猜这需要包括自定义标签并解析它们,但我没有在网上找到解决方案。如果有人遇到解决方法,请告诉我!