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