视图渲染器
使用视图渲染器
view()
函数是一个方便的函数,它获取 renderer
服务的一个实例,设置数据并渲染视图。尽管这通常正是你想要的,但你可能会发现有时你更希望直接与它一起工作。在这种情况下,你可以直接访问视图服务:
$view = service('renderer');
或者,如果你没有使用 View
类作为默认渲染器,你可以直接实例化它:
$view = new \CodeIgniter\View\View();
重要
你应该仅在控制器中创建服务。如果你需要从库中访问 View 类, 应该在库的构造函数中将其设置为依赖项。
然后,你可以使用它提供的三种标准方法中的任何一种:
render()
、
setVar()
和
setData() <CodeIgniter\View\View::setData()
。
它的工作原理
View
类在提取视图参数为 PHP 变量后处理应用程序视图路径中的常规 HTML/PHP 脚本,
使脚本可以访问它们。这意味着视图参数名称需要是合法的 PHP 变量名称。
View 类在内部使用关联数组来累积视图参数,直到你调用它的 render()
。
这意味着你的参数(或变量)名称需要是唯一的,否则后面的变量设置将覆盖早期的设置。
这也会影响根据脚本中的不同上下文对参数值进行转义。 你将必须为每个转义值提供一个唯一的参数名称。
值为数组的参数没有特殊含义。需要你在 PHP 代码中适当处理数组。
设置视图参数
setVar()
方法设置一个视图参数。
$view->setVar('name', 'Joe', 'html');
setData()
方法一次设置多个视图参数。
$view->setData(['name' => 'George', 'position' => 'Boss']);
方法链式调用
setVar()
和 setData()
方法是可链式调用的,允许你将许多不同的调用组合在一起:
$view->setVar('one', $one)
->setVar('two', $two)
->render('myView');
转义数据
当你将数据传递给 setVar()
和 setData()
函数时,你可以选择对数据进行转义以防止跨站脚本攻击。作为这两种方法中的最后一个参数,你可以传递所需的上下文来转义数据。请参见下文了解上下文描述。
如果你不想转义数据,可以将 'raw'
或 null
作为每个函数的最后一个参数传递:
$view->setVar('one', $one, 'raw');
如果选择不转义数据,或者正在传递对象实例,则可以在视图中使用 esc()
函数手动转义数据。第一个参数是要转义的字符串。第二个参数是转义数据的上下文(见下文):
<?= esc($object->getStat()) ?>
转义上下文
默认情况下, esc()
以及转而 setVar()
和 setData()
函数假设你要转义的数据打算在标准 HTML 中使用。
然而,如果数据打算用于 JavaScript、CSS 或 href 属性中,你需要不同的转义规则才能有效。
你可以将上下文的名称作为第二个参数传递。有效的上下文是 'html'
、 'js'
、 'css'
、 'url'
和 'attr'
<a href="<?= esc($url, 'url') ?>" data-foo="<?= esc($bar, 'attr') ?>">Some Link</a>
<script>
var siteName = '<?= esc($siteName, 'js') ?>';
</script>
<style>
body {
background-color: <?= esc('bgColor', 'css') ?>
}
</style>
视图渲染器选项
可以将多个选项传递给 render()
或 renderString()
方法:
$options
cache
- 缓存视图结果的时间(以秒为单位);对于renderString()
无效。cache_name
- 用于保存/检索缓存视图结果的 ID;默认为$viewPath
;对于renderString()
无效。debug
- 可以设置为 false 以禁用 调试工具栏 的调试代码添加。
$saveData
- 如果视图数据参数应保留以供后续调用,则为 true。
备注
接口定义的 $saveData
必须是布尔值,但实现类(如下面的 View
)可以扩展为包括 null
值。
类参考
- class CodeIgniter\View\View
- render($view[, $options[, $saveData = false]])
- 参数:
$view (
string
) – 视图源文件的名称$options (
array
) – 选项的键/值对数组$saveData (
boolean|null
) – 如果为 true,将保存数据供任何其他调用使用。如果为 false,渲染视图后将清除数据。如果为 null,使用配置设置。
- 返回:
所选视图的渲染文本
- 返回类型:
string
根据文件名和已设置的数据构建输出:
echo $view->render('myview');
- renderString($view[, $options[, $saveData = false]])
- 参数:
$view (
string
) – 要渲染的视图内容,例如从数据库检索的内容$options (
array
) – 选项的键/值对数组$saveData (
boolean|null
) – 如果为 true,将保存数据供任何其他调用使用。如果为 false,渲染视图后将清除数据。如果为 null,使用配置设置。
- 返回:
所选视图的渲染文本
- 返回类型:
string
根据视图片段和已设置的数据构建输出:
echo $view->renderString('<div>My Sharona</div>');
警告
这可以用来显示可能存储在数据库中的内容,但你需要注意这是一个潜在的安全漏洞, 并且你 必须 验证任何此类数据,可能适当地对其进行转义!
- setData([$data[, $context = null]])
- 参数:
$data (
array
) – 视图数据字符串的关联数组,作为键/值对$context (
string
) – 用于数据转义的上下文
- 返回:
渲染器,用于方法链
- 返回类型:
CodeIgniter\View\RendererInterface
一次设置多个视图数据:
$view->setData(['name' => 'George', 'position' => 'Boss']);
支持的转义上下文:
html
、css
、js
、url
或attr
或raw
。 如果是'raw'
,将不进行转义。每次调用都会向对象累积的数据数组添加数据,直到渲染视图为止。
- setVar($name[, $value = null[, $context = null]])
- 参数:
$name (
string
) – 视图数据变量的名称$value (
mixed
) – 此视图数据的值$context (
string
) – 用于数据转义的上下文
- 返回:
渲染器,用于方法链
- 返回类型:
CodeIgniter\View\RendererInterface
设置单个视图数据:
$view->setVar('name', 'Joe', 'html');
支持的转义上下文:
html
、css
、js
、url
、attr
或raw
。 如果是'raw'
,将不进行转义。如果你使用先前已对此对象使用过的视图数据变量,新值将替换现有值。