Skip to content
a simple PHP templating engine
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src
LICENSE
README.md

README.md

Flake

Flake 一个简单而又强大的模板引擎。支持 视图继承视图片段 功能,使用原生的PHP代码,帮助你灵活地控制页面布局。

例如视图被保存在 resources/views 文件夹内。

<!-- 视图被保存在 resources/views/index.php -->
<html>
    <body>
        <h1>Hello, <?php echo $name; ?></h1>
    </body>
</html>

这个视图可以使用以下的代码传递到用户的浏览器:

$flake = new Flake('index', 'resources/views', [
    'name' => 'World!',
]);

$flake->render();

如你所见,Flake 构造函数的第一个参数为视图文件;第二个参数为对应到视图文件的位置; 第三个参数是一个能够在视图内取用的数据数组。

视图数据

向视图传递数据后,可以在视图文件中获取以 键名 作为变量名的值。 在下面的例子代码中,视图将可以使用 $total$fruits 来取得数据,其值分别为 100array('apple', 'banana')

$flake = new Flake('index', 'resources/views', [
    'total' => 100,
    'fruits' => ['apple', 'banana'],
]);

$flake->render();

在视图文件中:

<p><?php echo $total; ?></p>
<ul>
<?php foreach ($fruits as $fruit) { ?>
    <li><?php echo $fruit; ?></li>
<?php } ?>
</ul>

在视图中,可访问 $this 指向 Flake 对象来管理和渲染这个视图文件。

所以我们可以使用用视图对象的 get() 方法来获取视图数据,使用 get() 方法的好处是可以设置数据不存在时的默认值:

<p><?php echo $this->get('total'); ?></p>
<ul>
<?php foreach ($this->get('fruits', []) as $fruit) { ?>
    <li><?php echo $fruit; ?></li>
<?php } ?>
</ul>

视图继承和视图片段

大多数页面应用都有相同的页头和页尾,传统的方法是把相同的页头和页尾存在不同的文件或者函数,然后按顺序加载。

<!-- 页头 header.php -->
<html>
<head>
    <title>title</title>
</head>
<body>
<header>Header</header>
<!-- 页尾 footer.php -->
<footer>footer</footer>
</body>
</html>
<!-- 视图 -->
<?php require('header.php') ?>
<article>
    ......
</article>
<?php require('footer.php') ?>

我们可以看到这种方法将一个 HTML 整体分割为三部分,但这样做,当每一个页面的页头和页尾不同时,我们就需要添加判断或者新建不同的页头和页尾文件。

视图继承和视图片段将这些公共的部分(如页头和页尾)放到一个布局中,渲染内容视图后在合适的地方嵌入到布局中。

定义一个页面布局

<!-- 视图被保存在 resources/views/layout/main.php -->
<html>
<head>
    <meta charset="utf-8">
    <title>Name: <?php $this->section('title', '视图标题'); ?></title>
</head>
<body>
    <?php $this->section('header') ?>
    <?php $this->content(); ?>
    <footer>我是页脚</footer>
</body>
</html>

在视图模板中使用页面布局

<!-- 视图被保存在 resources/views/index.php -->
<?php $this->extend('layout/main'); // 视图继承 ?>

<!-- 这区域是视图的内容 -->
Hello, <?php echo $name; ?>
<!-- 这区域是视图的内容 -->

<?php $this->def('title', '我是首页'); // 定义一个视图片段 ?>

<?php $this->def('header'); // 开始定义一个视图片段 ?>
<header>我是头部</header>
<?php $this->end(); // 结束定义一个视图片段 ?>

如你所见,在视图模板中,使用 extend() 方法继承一个页面布局,方法的参数为页面布局所在的文件。

使用 section() 方法在视图中定义一个视图片段,参数为 片段的名称片段的默认内容,如 $this->section('title', '视图标题')$this->section('header')

视图片段的内容定义在 def()end() 之间。如:

<?php $this->def('header'); // 开始定义一个视图片段, 片段的名称为 header ?>
<header>我是头部</header>
<?php $this->end(); // 结束定义一个视图片段 ?>

注意,一般 def()end() 方法应该成对出现, 但传递第二个参数,则不需要 end() 了,否则输出并不是你想要的。

$this->def('title', '这里是一个标题');

// 或者
$this->def('title');
这里是一个标题。
$this->end();

在页面布局(也就是父模板)中使用 content() 方法返回继承自其的视图内容。

<div><?php $this->content(); ?></div>

嵌套视图

<html>
...
    <?php $this->nest('header'); ?>
    ...
    <?php $this->nest('footer'); ?>
...
</html>
You can’t perform that action at this time.