视图渲染器
使用视图渲染器
该 view()
函数是一个便捷函数,它获取 renderer
服务的实例,设置数据并渲染视图。虽然这通常正是您想要的,但您可能会发现有时您想更直接地使用它。在这种情况下,您可以直接访问 View 服务
$view = \Config\Services::renderer();
或者,如果您没有使用 View
类作为您的默认渲染器,您可以直接实例化它
$view = new \CodeIgniter\View\View();
重要
您应该只在控制器中创建服务。如果您需要从库中访问 View 类,您应该在库的构造函数中将其设置为依赖项。
然后,您可以使用它提供的三种标准方法中的任何一种:render()
、setVar()
和 setData()
。
它做了什么
在将视图参数提取到 PHP 变量中后,View
类会处理存储在应用程序视图路径中的传统 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()
函数时,您可以选择转义数据以防止跨站点脚本攻击。作为任一方法中的最后一个参数,您可以传递所需的上下文以转义数据。有关上下文描述,请参见下文。
如果您不想对数据进行转义,可以将 null
或 'raw'
作为最后一个参数传递给每个函数。
$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()
方法。
cache
- 保存视图结果的时间(以秒为单位);对于renderString()
忽略。cache_name
- 用于保存/检索缓存视图结果的 ID;默认为视图路径;对于renderString()
忽略。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
) – 此视图数据的 value$context (
string
) – 用于数据转义的上下文。
- 返回值:
渲染器,用于方法链
- 返回类型:
CodeIgniter\View\RendererInterface.
设置单个视图数据
$view->setVar('name', 'Joe', 'html');
支持的转义上下文:
html
,css
,js
,url
,attr
或raw
。如果为'raw'
,则不会进行转义。如果您使用之前已用于此对象的视图数据变量,则新值将替换现有值。