主轴 / 视图
简单的布局渲染器
Requires
- php: >=5.3.2
Requires (Dev)
This package is not auto-updated.
Last update: 2024-09-24 01:02:39 UTC
README
这是一个用于在将纯PHP作为模板引擎使用时实现布局结构的库。这是一个非常小巧的库,只有一个类,但几乎涵盖了所有的“继承”功能。
没有自动转义等功能,但已经以helper的形式实现了最基础的转义功能。
可以使用composer进行安装。
$ composer require "spindle/view:*"
从版本1.0.2开始,GitHub的zip-archive中只包含最基本的数据源代码。如果需要test或example,请参考此仓库或使用--prefer-source选项。
$ composer require "spindle/view:*" --prefer-source
使用方法
由于只有一个类,因此可以通过require_once加载,也可以通过composer自动加载。
1. 简单示例
template.phtml
是一个用纯PHP编写的模板文件。将 $title和$main 填充后,就可以得到完整的HTML字符串。
<html> <head> <title><?= $title ?></title> </head> <body> <h1><?= $title ?></h1> <div class="main"> <?= $main ?> </div> </body> </html>
要将其转换为HTML,可以编写以下脚本。
<?php require 'vendor/autoload.php'; $view = new Spindle\View('template.phtml'); $view->title = 'Spindle Example'; $view->main = 'Hello! Spindle/View!'; echo $view->render();
render()方法将模板文件转换为字符串并返回。render()方法本身不会输出到屏幕,因此需要根据需要使用echo进行输出。
1-1. 视图变量传递方式
在将值传递到模板文件时,有多种方法。
//一つ一つ渡す $view->title = 'sample'; $view->data = array(1,2,3); //連想配列からまとめて渡す $view->assign(array( 'title' => 'sample', 'data' => array(1,2,3), )); // compactを使うとこんな書き方でもOK $title = 'sample'; $data = array(1,2,3); $view->assign(compact('title', 'data'));
另一方面,在接收端的模板文件中,变量是展开的。可以用$title
或$data
来引用。也可以用$this->title
或$this->data
来引用。添加this的方法是冗余的,但在变量替换操作期间,会有不同的行为。具体请参考布局部分。
<!-- 同じ意味 --> <title><?= $title ?></title> <title><?= $this->title ?></title> <ul> <?php foreach ($data as $i): ?> <li><?= $i ?></li> <?php endforeach ?> </ul>
可以传递的变量类型没有限制,可以直接传递对象。
与PHP的常规函数不同,模板文件没有明确指出可以接受哪些参数。与传递大量变量相比,将变量组合成一个或两个对象传递可能更容易维护。
1-2. 视图变量作用域
视图脚本在函数内执行,因此变量的作用域是局部的。在模板文件中随意创建或修改变量是局部的,不会污染全局空间。
1-3. 模板文件搜索路径
如果未指定特定的路径来搜索template.phtml,则会按顺序搜索include_path。如果没有改变PHP的设置,则view脚本和相同路径将作为最优先搜索。
如果需要从特定路径指定,请使用第二个参数指定搜索基准路径。绝对路径和相对路径都可以。
$view = new Spindle\View('template.phtml', '/path/to/template');
2. 布局
模板可以是嵌套的。
假设template.phtml写成以下这样,
<?php $this->setLayout('layout.phtml') ?> template
而layout.phtml写成以下这样,
<div> <?= $this->content() ?> </div>
template.phtml的结果将是以下这样。
<div> template </div>
请注意,template.phtml指定了应该是父布局模板的模板。$this->content()在存在子模板时返回其绘制结果,单独调用时返回空字符串。
2-1. 模板的绘制顺序
模板是从内部开始的。因此,如果对视图变量进行加工,会影响到外部的布局模板。具体请参考example/03。
特别是,对数组类型的视图变量进行操作时,可能会出现意想不到的行为。使用$this->append($name, array( ... ))
或$this->prepend($name, array( ... ))
可以更直观地处理数组类型的视图变量。
3. 嵌套布局
布局可以无限嵌套。(实际上,取决于计算机内存的容量。)如果父布局模板设置了setLayout,则可以无限嵌套。
具体请参考example/04。
4. 部分模板
可以使用$this->partial()
方法代替PHP的include语句。可以从相同的基准路径搜索模板,部分模板也可以通过setLayout
嵌套。
具体请参考example/05和example/06。
许可证
Spindle/View的版权已经放弃。使用时没有限制,不需要联系作者或显示版权声明。即使是代码片段也可以随意复制使用。
CC0-1.0 (无保留权利)