mindplay / kisstpl
查看纯PHP模板的服务/模板引擎
Requires
- php: >=5.3
Requires (Dev)
- mindplay/benchpress: @dev
- mindplay/testies: dev-master
- phpunit/php-code-coverage: 2.*
README
一个非常简单的纯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
实例,并按顺序尝试它们。
后者在模块化场景中很有用,例如,使用“主题”文件夹进行模板覆盖,允许您根据需要插入必要的定位视图约定。