视图渲染器

使用视图渲染器

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']);

支持的转义上下文:htmlcssjsurl,或attrraw。如果为'raw',则不会进行转义。

每次调用都会添加到对象正在累积的数据数组中,直到视图被渲染。

setVar($name[, $value = null[, $context = null]])
参数:
  • $name (string) – 视图数据变量的名称

  • $value (mixed) – 此视图数据的 value

  • $context (string) – 用于数据转义的上下文。

返回值:

渲染器,用于方法链

返回类型:

CodeIgniter\View\RendererInterface.

设置单个视图数据

$view->setVar('name', 'Joe', 'html');

支持的转义上下文:htmlcssjsurlattrraw。如果为'raw',则不会进行转义。

如果您使用之前已用于此对象的视图数据变量,则新值将替换现有值。