CodeIgniter4 视图渲染器
使用视图渲染器
view()
方法是一种便捷功能,可以获取 renderer
服务实例,然后可以设置数据并显示视图。 这种方式是我们常用的方式,但有时候我们需要一种更为直接的使用方式;在这种情况下你可以直接以视图服务的形式调用它:
$view = \Config\Services::renderer();
如果不使用 View
类作为默认渲染器,则可以直接实例化它:
$view = new \CodeIgniter\View\View();
重要
你应该只在控制器内创建、使用服务。如果你想在其他类(Library)中使用,则应在类的构造函数中将其设置为依赖项。
然后,您可以使用它提供的三种标准方法中的任何一种: render(viewpath, options, save), setVar(name, value, context) 和 setData(data, context).
它是做什么的
View
类将视图的参数提取到可在脚本内部访问的PHP变量后,处理存储在应用程序视图路径中的标准 HTML/PHP 脚本。 这意味着视图中的参数名称必须是合法的 PHP 变量名。
View
类在内部使用一个关联数组,以保存视图参数,直到调用 render()
方法为止。这意味着视图参数(或变量)名称必须是 唯一的,否则后面变量的值将覆盖前面的变量。
同时,这还会影响脚本中不同上下文的参数值,你将必须为每个值赋予唯一的参数名称。
数组类型的值没有任何特殊含义,可以根据自己的 PHP 代码处理数组。
链式调用方法
setVar() 和 setData() 方法支持链式调用,允许将多个不同的调用组合到一个方法链中使用:
$view->setVar('one', $one)
->setVar('two', $two)
->render('myView');
转义数据
当你将数据传递给 setVar()
和 setData()
方法时,可以选择转义数据以防止跨站点脚本攻击。作为这两种方法中的最后一个参数,你 可以传递所需的上下文,以选择是否对数据进行转义。
如果你不想对数据进行转义,你可以向每个方法的最后一个参数传递 null 或 raw,这样将不会对数据进行转义:
$view->setVar('one', $one, 'raw');
如果选择不转义数据,或者要传递对象实例,则可以使用 esc()
辅助方法在视图中手动转义数据。第一个参数是要转义的字符串,第二个参数是 用于转义数据的上下文(请参见下文):
<?= \esc($object->getStat()) ?>
注解
译者注:框架内部使用\Zend\Escaper\Escaper
类中以 escape 开头的相关方法对数据进行的转义处理。
转义上下文
默认情况下,esc()
方法认为要转义的数据会在 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
- 保存缓存视图结果的文件名,默认是 viewpath, renderString() 方法中会忽略saveData
- 如果要保留视图的参数,并在后续调用中使用,应设置为 true
类参考
CodeIgniter\View\View
render
($view[, $options[, $saveData=false]]])
参数: | $view (string) – 源视图文件的文件名 |
---|---|
$options (array) – 以键值对传递的选项数组 | |
$saveData (boolean) – 如果该值为 true , 该方法会保留该数据并为其他调用使用;反之就会在渲染视图后清除该数据 | |
返回: | 指定视图文件所渲染的文字内容 |
返回类型: | string |
根据传入的文件名和预先设置的数据来渲染输出:
echo $view->render('myview');
renderString
($view[, $options[, $saveData=false]]])
参数: | $view (string) – 需要渲染的视图的内容,例如从数据库里返回的内容等 |
---|---|
$options (array) – 以键值对传递的选项数组 | |
$saveData (boolean) – 如果该值为 true , 该方法会保留该数据并为其他调用使用;反之就会在渲染视图后清除该数据 | |
返回: | 指定视图文件所渲染的文字内容 |
返回类型: | 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, or attr or 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, or attr or raw, 如果是 ‘raw’ 的话,就不进行转义
如果你想要使用对该对象已使用过的视图数据变量,新的值就会取代老的值。
更多建议: