视图渲染器

使用视图渲染器

view() 函数是一个方便的函数,它获取 renderer 服务的一个实例,设置数据并渲染视图。尽管这通常正是你想要的,但你可能会发现有时你更希望直接与它一起工作。在这种情况下,你可以直接访问视图服务:

$view = \Config\Services::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']);

支持的转义上下文:htmlcssjsurlattrraw。 如果是 'raw',将不进行转义。

每次调用都会向对象累积的数据数组添加数据,直到渲染视图为止。

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

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

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

返回:

渲染器,用于方法链

返回类型:

CodeIgniter\View\RendererInterface

设置单个视图数据:

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

支持的转义上下文: htmlcssjsurlattrraw。 如果是 'raw',将不进行转义。

如果你使用先前已对此对象使用过的视图数据变量,新值将替换现有值。