mindplay/kisstpl

查看纯PHP模板的服务/模板引擎

1.3.3 2017-09-07 09:07 UTC

This package is auto-updated.

Last update: 2024-08-25 18:47:51 UTC


README

PHP Version Build Status Code Coverage Scrutinizer Code Quality

一个非常简单的纯PHP模板视图服务/模板引擎。

我想找到一个模板引擎,它使用视图模型(对象)而不是视图字典(数组),这在大多数PHP模板引擎中很典型。

哦,如果你不喜欢整天输入 htmlspecialchars(),也许可以试试 这个

视图服务与根文件夹和根命名空间相关联

$service = new ViewService(new SimpleViewFinder('my/app/views', 'app\view'));

$hello = new \app\view\HelloWorld();

$service->render($hello); // -> "my/app/views/HelloWorld.view.php"

在这个例子中,render() 语句将渲染模板 my/app/views/HelloWorld.view.php,将视图模型对象作为 $view 传递给渲染的模板 - SimpleViewFinder 负责根据视图模型类型定位实际模板。

render() 方法还接受第二个参数,允许您为同一视图模型渲染不同的模板

$service->render($hello, 'boom'); // -> "my/app/views/HelloWorld.boom.php"
$service->render($hello, 'bang'); // -> "my/app/views/HelloWorld.bang.php"

您可以在模板文件的开始处进行类型提示以支持IDE

<?php

use app\view\HelloWorld;

/**
 * @var HelloWorld $view
 */

?>
...

或者,为了进行类型安全的模板渲染,您也可以通过返回闭包静态地进行类型提示

use app\view\HelloWorld;
use mindplay\kisstpl\Renderer;

<?php return function(HelloWorld $view, Renderer $renderer) { ?>
...
<?php }

像布局这样的东西可以通过使用普通的OOP组合来实现。例如,假设我们有一个具有 $body 属性的 Layout 视图模型,并且我们在 HelloWorld 模型的 $layout 属性中有一个布局视图模型实例 - 为了实现典型的两步布局,在HelloWorld模板中,使用 begin()end() 缓存并捕获内容部分

<?php

use app\view\HelloWorld;
use mindplay\kisstpl\ViewService;

/**
 * @var HelloWorld $view
 * @var ViewService $this
 */

$view->layout->title = 'My Page!';

$this->begin($view->layout->body);

?>
<h1>Hello!</h1>
<p>Body content goes here...</p>
<?php

$this->end($view->layout->body);

$this->render($view->layout);

注意,begin()end() 使用变量 引用 作为参数 - end() 的调用将捕获的内容应用到 $view->layout->body

故意没有视图渲染“管道”或任何布局概念,这是“好事” - 您的模板完全控制渲染过程,您始终有IDE支持

您还可以捕获渲染内容并返回它,而不是将渲染内容发送到输出

$content = $service->capture($hello);

您可以使用此功能来实现“部分”,因为它可以从模板内部调用。像 render() 一样,capture() 方法也接受第二个参数,允许您为同一视图模型渲染不同的视图。

当然,您还可以通过扩展 ViewService 来添加自定义功能 - 接口 Renderer 定义了四个基本方法,render()capture()begin()end(),因此您可以根据需要进行类型提示和交换实现。

如果需要自定义逻辑(特定于您的项目)来定位模板,您还可以替换 ViewFinder 实现。包括一些实现

  • SimpleViewFinder 用于直接 1:1 类到文件的映射(以及从 file_exists() 调用中节省的零开销),具有指定的基础命名空间和根路径。

  • LocalViewFinder 用于直接 1:1 类到文件的映射(以及零开销),不受任何特定命名空间的限制,并假设本地视图文件位于视图模型类文件相同的路径中。

  • DefaultViewFinder 搜索一系列根路径,并默认使用找到的第一个模板。

  • MultiViewFinder 允许您聚合所需数量的其他 ViewFinder 实例,并按顺序尝试它们。

后者在模块化场景中很有用,例如,使用“主题”文件夹进行模板覆盖,允许您根据需要插入必要的定位视图约定。