CodeIgniter4 視圖渲染器

2020-08-13 16:43 更新

使用視圖渲染器

view() 方法是一種便捷功能,可以獲取 renderer 服務實例,然后可以設置數(shù)據(jù)并顯示視圖。 這種方式是我們常用的方式,但有時候我們需要一種更為直接的使用方式;在這種情況下你可以直接以視圖服務的形式調用它:

$view = \Config\Services::renderer();

如果不使用 View 類作為默認渲染器,則可以直接實例化它:

$view = new \CodeIgniter\View\View();

重要

你應該只在控制器內創(chuàng)建、使用服務。如果你想在其他類(Library)中使用,則應在類的構造函數(shù)中將其設置為依賴項。

然后,您可以使用它提供的三種標準方法中的任何一種: render(viewpath, options, save), setVar(name, value, context)setData(data, context).

它是做什么的

View 類將視圖的參數(shù)提取到可在腳本內部訪問的PHP變量后,處理存儲在應用程序視圖路徑中的標準 HTML/PHP 腳本。 這意味著視圖中的參數(shù)名稱必須是合法的 PHP 變量名。

View 類在內部使用一個關聯(lián)數(shù)組,以保存視圖參數(shù),直到調用 render() 方法為止。這意味著視圖參數(shù)(或變量)名稱必須是 唯一的,否則后面變量的值將覆蓋前面的變量。

同時,這還會影響腳本中不同上下文的參數(shù)值,你將必須為每個值賦予唯一的參數(shù)名稱。

數(shù)組類型的值沒有任何特殊含義,可以根據(jù)自己的 PHP 代碼處理數(shù)組。

鏈式調用方法

setVar() 和 setData() 方法支持鏈式調用,允許將多個不同的調用組合到一個方法鏈中使用:

$view->setVar('one', $one)
     ->setVar('two', $two)
     ->render('myView');

轉義數(shù)據(jù)

當你將數(shù)據(jù)傳遞給 setVar()setData() 方法時,可以選擇轉義數(shù)據(jù)以防止跨站點腳本攻擊。作為這兩種方法中的最后一個參數(shù),你 可以傳遞所需的上下文,以選擇是否對數(shù)據(jù)進行轉義。

如果你不想對數(shù)據(jù)進行轉義,你可以向每個方法的最后一個參數(shù)傳遞 null 或 raw,這樣將不會對數(shù)據(jù)進行轉義:

$view->setVar('one', $one, 'raw');

如果選擇不轉義數(shù)據(jù),或者要傳遞對象實例,則可以使用 esc() 輔助方法在視圖中手動轉義數(shù)據(jù)。第一個參數(shù)是要轉義的字符串,第二個參數(shù)是 用于轉義數(shù)據(jù)的上下文(請參見下文):

<?= \esc($object->getStat()) ?>

注解

譯者注:框架內部使用 \Zend\Escaper\Escaper 類中以 escape 開頭的相關方法對數(shù)據(jù)進行的轉義處理。

轉義上下文

默認情況下,esc() 方法認為要轉義的數(shù)據(jù)會在 HTML 中使用。如果數(shù)據(jù)打算用于 Javascript、CSS 或 href 屬性時,需要不同的轉義規(guī)則才 能生效。你可以傳入轉義類型名稱作為第二個參數(shù),選擇合適的規(guī)則。規(guī)則支持 ‘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 - 如果要保留視圖的參數(shù),并在后續(xù)調用中使用,應設置為 true

類參考

CodeIgniter\View\View

render($view[, $options[, $saveData=false]]])

參數(shù): $view (string) – 源視圖文件的文件名
$options (array) – 以鍵值對傳遞的選項數(shù)組
$saveData (boolean) – 如果該值為 true , 該方法會保留該數(shù)據(jù)并為其他調用使用;反之就會在渲染視圖后清除該數(shù)據(jù)
返回: 指定視圖文件所渲染的文字內容
返回類型: string

根據(jù)傳入的文件名和預先設置的數(shù)據(jù)來渲染輸出:

echo $view->render('myview');

renderString($view[, $options[, $saveData=false]]])

參數(shù): $view (string) – 需要渲染的視圖的內容,例如從數(shù)據(jù)庫里返回的內容等
$options (array) – 以鍵值對傳遞的選項數(shù)組
$saveData (boolean) – 如果該值為 true , 該方法會保留該數(shù)據(jù)并為其他調用使用;反之就會在渲染視圖后清除該數(shù)據(jù)
返回: 指定視圖文件所渲染的文字內容
返回類型: string

根據(jù)給定的視圖分塊和預先設置的數(shù)據(jù)來渲染輸出:

echo $view->renderString('<div>My Sharona</div>');

該方法可以用于輸出一些例如數(shù)據(jù)庫中存儲的內容。但是你需要意識到這一操作可能是有安全風險的,并且必須對這些數(shù)據(jù)進行驗證以及盡可能進行轉義!

setData([$data[, $context=null]])

參數(shù): $data (array) – 以鍵值對傳遞的視圖數(shù)據(jù)數(shù)組
$context (string) – 使用數(shù)據(jù)轉義的上下文
返回: 用于方法鏈式調用的渲染器
返回類型: CodeIgniter\View\RendererInterface.

同時設置多組視圖數(shù)據(jù):

$view->setData(['name'=>'George', 'position'=>'Boss']);

支持以下的上下文: html, css, js, url, or attr or raw, 如果是 ‘raw’ 的話,就不進行轉義

每個調用都會為對象附加一個屬性數(shù)據(jù),直到視圖被渲染

setVar($name[, $value=null[, $context=null]])

參數(shù): $name (string) – 視圖數(shù)據(jù)變量的變量名
$value (mixed) – 該變量的變量值
$context (string) – 使用數(shù)據(jù)轉義的上下文
返回: 用于方法鏈式調用的渲染器
返回類型: CodeIgniter\View\RendererInterface.

設置單個數(shù)據(jù)變量:

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

支持以下的上下文: html, css, js, url, or attr or raw, 如果是 ‘raw’ 的話,就不進行轉義

如果你想要使用對該對象已使用過的視圖數(shù)據(jù)變量,新的值就會取代老的值。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號