視圖渲染器?
使用視圖渲染器?
view()
方法是一種便捷功能,可以獲取 renderer
服務(wù)實(shí)例,然后可以設(shè)置數(shù)據(jù)并顯示視圖。
這種方式是我們常用的方式,但有時(shí)候我們需要一種更為直接的使用方式;在這種情況下你可以直接以視圖服務(wù)的形式調(diào)用它:
$view = \Config\Services::renderer();
如果不使用 View
類(lèi)作為默認(rèn)渲染器,則可以直接實(shí)例化它:
$view = new \CodeIgniter\View\View();
重要
你應(yīng)該只在控制器內(nèi)創(chuàng)建、使用服務(wù)。如果你想在其他類(lèi)(Library)中使用,則應(yīng)在類(lèi)的構(gòu)造函數(shù)中將其設(shè)置為依賴(lài)項(xiàng)。
然后,您可以使用它提供的三種標(biāo)準(zhǔn)方法中的任何一種: render(viewpath, options, save), setVar(name, value, context) 和 setData(data, context).
它是做什么的?
View
類(lèi)將視圖的參數(shù)提取到可在腳本內(nèi)部訪問(wèn)的PHP變量后,處理存儲(chǔ)在應(yīng)用程序視圖路徑中的標(biāo)準(zhǔn) HTML/PHP 腳本。
這意味著視圖中的參數(shù)名稱(chēng)必須是合法的 PHP 變量名。
View
類(lèi)在內(nèi)部使用一個(gè)關(guān)聯(lián)數(shù)組,以保存視圖參數(shù),直到調(diào)用 render()
方法為止。這意味著視圖參數(shù)(或變量)名稱(chēng)必須是
唯一的,否則后面變量的值將覆蓋前面的變量。
同時(shí),這還會(huì)影響腳本中不同上下文的參數(shù)值,你將必須為每個(gè)值賦予唯一的參數(shù)名稱(chēng)。
數(shù)組類(lèi)型的值沒(méi)有任何特殊含義,可以根據(jù)自己的 PHP 代碼處理數(shù)組。
鏈?zhǔn)秸{(diào)用方法?
setVar() 和 setData() 方法支持鏈?zhǔn)秸{(diào)用,允許將多個(gè)不同的調(diào)用組合到一個(gè)方法鏈中使用:
$view->setVar('one', $one)
->setVar('two', $two)
->render('myView');
轉(zhuǎn)義數(shù)據(jù)?
當(dāng)你將數(shù)據(jù)傳遞給 setVar()
和 setData()
方法時(shí),可以選擇轉(zhuǎn)義數(shù)據(jù)以防止跨站點(diǎn)腳本攻擊。作為這兩種方法中的最后一個(gè)參數(shù),你
可以傳遞所需的上下文,以選擇是否對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)義。
如果你不想對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)義,你可以向每個(gè)方法的最后一個(gè)參數(shù)傳遞 null 或 raw,這樣將不會(huì)對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)義:
$view->setVar('one', $one, 'raw');
如果選擇不轉(zhuǎn)義數(shù)據(jù),或者要傳遞對(duì)象實(shí)例,則可以使用 esc()
輔助方法在視圖中手動(dòng)轉(zhuǎn)義數(shù)據(jù)。第一個(gè)參數(shù)是要轉(zhuǎn)義的字符串,第二個(gè)參數(shù)是
用于轉(zhuǎn)義數(shù)據(jù)的上下文(請(qǐng)參見(jiàn)下文):
<?= \esc($object->getStat()) ?>
注解
譯者注:框架內(nèi)部使用 \Zend\Escaper\Escaper
類(lèi)中以 escape 開(kāi)頭的相關(guān)方法對(duì)數(shù)據(jù)進(jìn)行的轉(zhuǎn)義處理。
轉(zhuǎn)義上下文?
默認(rèn)情況下,esc()
方法認(rèn)為要轉(zhuǎn)義的數(shù)據(jù)會(huì)在 HTML 中使用。如果數(shù)據(jù)打算用于 Javascript、CSS 或 href 屬性時(shí),需要不同的轉(zhuǎn)義規(guī)則才
能生效。你可以傳入轉(zhuǎn)義類(lèi)型名稱(chēng)作為第二個(gè)參數(shù),選擇合適的規(guī)則。規(guī)則支持 ‘html’, ‘js’, ‘css’, ‘url’ 和 ‘a(chǎn)ttr’:
<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>
視圖渲染器選項(xiàng)?
可以將多個(gè)選項(xiàng)信息傳遞給 render()
或 renderString()
方法:
cache
- 緩存視圖結(jié)果的時(shí)間(以秒為時(shí)間單位), renderString() 方法中會(huì)忽略cache_name
- 保存緩存視圖結(jié)果的文件名,默認(rèn)是 viewpath, renderString() 方法中會(huì)忽略saveData
- 如果要保留視圖的參數(shù),并在后續(xù)調(diào)用中使用,應(yīng)設(shè)置為 true
類(lèi)參考?
-
CodeIgniter\View\View
-
render
($view[, $options[, $saveData=false]]]) 參數(shù): - $view (string) – 源視圖文件的文件名
- $options (array) – 以鍵值對(duì)傳遞的選項(xiàng)數(shù)組
- $saveData (boolean) – 如果該值為 true , 該方法會(huì)保留該數(shù)據(jù)并為其他調(diào)用使用;反之就會(huì)在渲染視圖后清除該數(shù)據(jù)
返回: 指定視圖文件所渲染的文字內(nèi)容
返回類(lèi)型: string
根據(jù)傳入的文件名和預(yù)先設(shè)置的數(shù)據(jù)來(lái)渲染輸出:
echo $view->render('myview');
-
renderString
($view[, $options[, $saveData=false]]]) 參數(shù): - $view (string) – 需要渲染的視圖的內(nèi)容,例如從數(shù)據(jù)庫(kù)里返回的內(nèi)容等
- $options (array) – 以鍵值對(duì)傳遞的選項(xiàng)數(shù)組
- $saveData (boolean) – 如果該值為 true , 該方法會(huì)保留該數(shù)據(jù)并為其他調(diào)用使用;反之就會(huì)在渲染視圖后清除該數(shù)據(jù)
返回: 指定視圖文件所渲染的文字內(nèi)容
返回類(lèi)型: string
根據(jù)給定的視圖分塊和預(yù)先設(shè)置的數(shù)據(jù)來(lái)渲染輸出:
echo $view->renderString('<div>My Sharona</div>');
該方法可以用于輸出一些例如數(shù)據(jù)庫(kù)中存儲(chǔ)的內(nèi)容。但是你需要意識(shí)到這一操作可能是有安全風(fēng)險(xiǎn)的,并且**必須**對(duì)這些數(shù)據(jù)進(jìn)行驗(yàn)證以及盡可能進(jìn)行轉(zhuǎn)義!
-
setData
([$data[, $context=null]]) 參數(shù): - $data (array) – 以鍵值對(duì)傳遞的視圖數(shù)據(jù)數(shù)組
- $context (string) – 使用數(shù)據(jù)轉(zhuǎn)義的上下文
返回: 用于方法鏈?zhǔn)秸{(diào)用的渲染器
返回類(lèi)型: CodeIgniter\View\RendererInterface.
同時(shí)設(shè)置多組視圖數(shù)據(jù):
$view->setData(['name'=>'George', 'position'=>'Boss']);
支持以下的上下文: html, css, js, url, or attr or raw, 如果是 ‘raw’ 的話(huà),就不進(jìn)行轉(zhuǎn)義
每個(gè)調(diào)用都會(huì)為對(duì)象附加一個(gè)屬性數(shù)據(jù),直到視圖被渲染
-
setVar
($name[, $value=null[, $context=null]]) 參數(shù): - $name (string) – 視圖數(shù)據(jù)變量的變量名
- $value (mixed) – 該變量的變量值
- $context (string) – 使用數(shù)據(jù)轉(zhuǎn)義的上下文
返回: 用于方法鏈?zhǔn)秸{(diào)用的渲染器
返回類(lèi)型: CodeIgniter\View\RendererInterface.
設(shè)置單個(gè)數(shù)據(jù)變量:
$view->setVar('name','Joe','html');
支持以下的上下文: html, css, js, url, or attr or raw, 如果是 ‘raw’ 的話(huà),就不進(jìn)行轉(zhuǎn)義
如果你想要使用對(duì)該對(duì)象已使用過(guò)的視圖數(shù)據(jù)變量,新的值就會(huì)取代老的值。
-