grithin / phptemplate
PHP 模板。
Requires
- php: >=7
- grithin/phpbase: >=5
README
一个可定制的简单模板系统,使用原生PHP。
功能
- 模板层次结构(一个模板可以有父级包装器)
- 区域化部分(可以定义稍后包含的区域)
- 组件化部分(可以在模板内要求另一个模板)
- 可预期的包含路径
- 依赖于文件系统层次结构
- 允许相对路径包含(相对于当前模板)
关于PHP-HTML集成的注意事项
意大利面代码很糟糕,但将PHP代码与HTML集成不一定会导致意大利面代码。
如果你遵循一套合理的规则,并且不将控制代码与视图代码混合,你就没问题。
人们提出使用具有自定义语法的模板系统的理由通常是不合理的
- 更好的语法。 这取决于你的观点
- 简短的帮助函数。这个工具可以拥有简短的帮助函数。我们可以让
$e
执行HTML转义
<span><?= $e($name) ?></span>
在排除避免意大利面代码之后,剩下的唯一原因是安全性。一些模板引擎允许你防止执行任意PHP代码,这允许你减少设计者在使用代码时可能造成的损害。
尽管即使模板是用原生PHP代码编写的,也可以进行安全性操作(get_all_tokens
),但我没有这样的需求,所以我没有扩展这个工具来执行这样的操作,如果你需要这种安全性,你应该选择另一个具有此功能的模板引擎(twig)或者说服我花时间扩展这个工具。
为什么?
可能主要是由于2006年的一次不良经历,当时我不得不重写smarty模板引擎的各个部分来修复公司遇到的缓存问题。但,除此之外
- 我不认为在PHP之上添加更多开发者需要学习的自定义语法有什么好处
- 有时,在模板显示之前对数据进行格式化是必要的PHP代码。在自定义语法模板引擎中,这些PHP代码被迫放在控制代码中,尽管它们是视图代码。
- Laravel的Blade模板引擎很荒谬。在众多事情中,它将参数作为一个未解析的单个字符串传递给辅助函数。祝你成功地找出如何在模板内包含另一个模板文件的方法。
- Twig。如果你想将变量传递给父模板,你必须将这些变量转换为块。在这个引擎中,不仅传递给子模板的模板变量会被传递到父模板,而且子模板还可以添加变量传递给父模板。
- 一般来说,子PHP模板的功能集将始终小于PHP模板。
指南
直接使用
$Template = new \Grithin\Template(['directory'=>__DIR__.'/templates/']); $Template->get('page', ['first_name'=>'bob']);
模板文件预期以.php
结尾
你可以在模板内包含另一个模板
<?= $Template->get('sidemenu') ?>
你甚至可以相对于当前模板的路径这样做
<?= $Template->get('./sidemenu') ?>
如果网站部分有自己的侧边菜单,这可能很有用。
模板文件中的 $Template
变量被注入到模板的上下文中。它可以以三种方式引用,即 $t
、$template
和 $Template
,但只有 $Template
可以保证不会被覆盖。
这些键是提供给模板的辅助数组的一部分。辅助数组是一个列表,其中包含了导入到模板作用域中的变量。这些变量可以是值、闭包或任何可以放入变量中的内容。
$Template = new Template([ 'helpers'=>[ 'upper'=>function($x){ return strtoupper($x)}, 'name' => 'bob' ]])
<span><?= $upper($name) ?></span>
实例级别的辅助变量,如 t
,可能会被提供给 get
调用的具有相同键的变量覆盖。
$template->get('view_user', ['t'=> 'this will override the template variable for this template file inclusion'])
为了避免使用可能不存在的变量,传递给 get
的变量作为 $vars
中的键可用。
<?= isset($vars['name']) ? $name : 'Default Person' ?>
$vars
代表通过 get
传递的变量。$vars
可以被传递的变量覆盖。如果 $vars
被覆盖,它仍然可以通过 $Template->vars
访问。
您还可以访问被覆盖的类实例辅助函数。
<?= $helpers['name'] ?>
<?= $Template->helpers['name'] ?>
要获取当前模板的字符串标识,请使用 <?= $Template->template ?>
部分和层次结构
模板可以有一个父模板/布局。
<?php $Template->parent('layout') ?>
<div> Hello </div>
父模板通过 $Template->inner
指向子模板的内容。
<html><body> <?= $Template->inner ?> </html></body>
模板还可以使用部分。
<!-- create a header section and put meta tag into it --> <?php $Template->section('header') ?> <meta charset="utf-8" > <?php $Template->section_end() ?>
父模板或其他模板可以使用这些定义的部分。
<head> <?= $Template->sections['header'] ?> </head> <?=
您可以附加一个现有的部分。
<?php $Template->section('header') ?> <?= $Template->sections['header'] ?> <meta property="og:type" content= "website" /> <?php $Template->section_end() ?>
如果需要,您可以直接设置部分变量。
<?php $Template->sections['title']='The Page Title' ?>
父模板的复杂性
父模板获取传递给子模板的变量。尽管如此,子模板也可以向父模板传递变量,并且这些变量将根据键覆盖模板中的子变量。
<?php $Template->parent('layout', ['theme'=>'blue']) ?>