CodeIgniter4 視圖

2020-08-17 15:31 更新

視圖只是一個(gè)網(wǎng)頁(yè)或頁(yè)面片段,例如頁(yè)眉,頁(yè)腳,側(cè)邊欄等。實(shí)際上,視圖可以靈活地嵌入其他視圖中(在其他視圖內(nèi)部)。

視圖不會(huì)被直接調(diào)用,它必須通過(guò)控制器加載。請(qǐng)記住,在 MVC 框架中,控制器充當(dāng)交通警察的作用,因此它專門負(fù)責(zé)讀取特定的視圖。 如果你還沒(méi)有閱讀過(guò) 控制器 頁(yè)面,建議你應(yīng)該先看下這個(gè)。

使用在控制器這一章里我們所創(chuàng)建的樣例控制器,讓我們?yōu)樗鼊?chuàng)建一個(gè)視圖。

創(chuàng)建視圖

使用你的文本編輯器,創(chuàng)建一個(gè) BlogView.php 文件,代碼如下:

<html>
<head>
    <title>My Blog</title>
</head>
<body>
    <h1>Welcome to my Blog!</h1>
</body>
</html>

將文件保存到 app/Views 文件夾。

顯示視圖

要加載并且顯示指定的視圖文件,你需要用到下面的方法:

echo view('name');

name 是視圖文件的名稱。

重要

如果你省略了文件的擴(kuò)展名,那么框架會(huì)默認(rèn)該文件以 .php 擴(kuò)展名結(jié)尾。

現(xiàn)在,打開(kāi)你之前創(chuàng)建的 Blog.php 這個(gè)控制器文件,并將 echo 語(yǔ)句替換為 view 方法,以完成顯示視圖的功能:

<?php namespace App\Controllers;


class Blog extends \CodeIgniter\Controller
{
        public function index()
        {
                echo view('BlogView');
        }
}

如果你使用之前訪問(wèn)網(wǎng)站的 URL 來(lái)重新訪問(wèn)站點(diǎn),你應(yīng)該會(huì)看到新的視圖。這個(gè) URL 類似以下的內(nèi)容:

example.com/index.php/blog/

注解

盡管所有示例都是直接顯示視圖內(nèi)容,但是你也可以讓視圖內(nèi)容的結(jié)果返回給控制器;并將其添加到所有已捕獲的輸出內(nèi)容中。(譯者注:即不是直接輸出而是返回一個(gè)字符串用作后續(xù)使用)

加載多個(gè)視圖

CodeIgniter 可以智能的處理在控制器中多次調(diào)用 view() 方法。如果出現(xiàn)了多次調(diào)用,它們將被合并到一起。例如,你可能希望有一個(gè) 頁(yè)頭視圖、 一個(gè)菜單視圖,一個(gè)內(nèi)容視圖 以及 一個(gè)頁(yè)腳視圖。代碼看起來(lái)應(yīng)該這樣:

<?php namespace App\Controllers;


class Page extends \CodeIgniter\Controller
{
        public function index()
        {
                $data = [
                        'page_title' => 'Your title'
                ];


                echo view('header');
                echo view('menu');
                echo view('content', $data);
                echo view('footer');
        }
}

在上面的例子中,我們使用了 “添加動(dòng)態(tài)數(shù)據(jù)” ,我們會(huì)在后面講到。

在子目錄中存儲(chǔ)視圖

如果你喜歡這樣的組織形式,則視圖文件可以保存到子目錄中。當(dāng)你這樣做時(shí),加載視圖時(shí)需要包含子目錄的名字,例如:

echo view('directory_name/file_name');

命名空間視圖

您可以將視圖存儲(chǔ)在已命名空間的 View 目錄下,并像加載加載命名空間一樣加載視圖。雖然 PHP 不支持在命名空間下加載非類文件,但是 CodeIgniter 提供了此功能,使你可以將它們以類似于模塊的方式打包在一起,以便于重用或分發(fā)。

如果您在 自動(dòng)加載 文件 PSR-4 數(shù)組中設(shè)置 Blog 目錄在 Example\Blog 命名空間下,則可 以像使用命名空間一樣找到視圖文件。下面的示例就是通過(guò)在名稱空間前添加視圖名稱來(lái)從 /blog/views 目錄下加載 BlogView 文件:

echo view('Example\Blog\Views\BlogView');

注解

譯者注 這段有點(diǎn)難懂,需要和 模塊 章節(jié)一起看會(huì)比較容易懂。我的理解:框架中視圖文件默認(rèn)在 app/Views 目錄下,當(dāng)然這個(gè)也是可以通過(guò) app/Config/Paths.php 類的 $viewDirectory 屬性進(jìn)行更改的。那么如果我們使用了 modules 功能把 Blog 模塊獨(dú)立出來(lái),視圖文件也是可以正常加載的,那么就需要在 app/Config/Autoload.php 文件中設(shè)定好映射目錄,然后就可以通過(guò)命名空間的形式來(lái)加載視圖文件了。

緩存視圖

你可以通過(guò) view 方法的第三個(gè)參數(shù) cache 選項(xiàng)來(lái)實(shí)現(xiàn)視圖緩存功能,緩存的實(shí)際單位是秒:

// 視圖會(huì)緩存 60 秒
echo view('file_name', $data, ['cache' => 60]);

默認(rèn)情況下,緩存視圖的文件名與視圖文件名相同。不過(guò),你可以通過(guò)傳遞 cache_name 參數(shù)對(duì)緩存文件名進(jìn)行自定義:

// 視圖會(huì)緩存 60 秒
echo view('file_name', $data, ['cache' => 60, 'cache_name' => 'my_cached_view']);

視圖中顯示動(dòng)態(tài)數(shù)據(jù)

數(shù)據(jù)通過(guò)視圖方法的第二個(gè)參數(shù)從控制器傳遞到視圖,這是一個(gè)例子:

$data = [
        'title'   => 'My title',
        'heading' => 'My Heading',
        'message' => 'My Message'
];


echo view('blogview', $data);

讓我們打開(kāi)你的控制器文件,并添加一下代碼:

<?php namespace App\Controllers;


class Blog extends \CodeIgniter\Controller
{
        public function index()
        {
                $data['title']   = "My Real Title";
                $data['heading'] = "My Real Heading";


                echo view('blogview', $data);
        }
}

現(xiàn)在打開(kāi)視圖文件,并將文本更改為與數(shù)據(jù)中的數(shù)組鍵對(duì)應(yīng)的變量:

<html>
<head>
    <title><?= $title ?></title>
</head>
<body>
    <h1><?= $heading ?></h1>
</body>
</html>

現(xiàn)在重新刷新頁(yè)面,你應(yīng)該會(huì)看到變量已經(jīng)替換成數(shù)據(jù)中的值。

默認(rèn)情況下,傳遞的數(shù)據(jù)只在當(dāng)前調(diào)用 view 中可用。如果在一次請(qǐng)求中多次調(diào)用該方法,則必須將所需的數(shù)據(jù)傳遞給每個(gè)視圖。這樣可以防止 數(shù)據(jù)顯示/覆蓋到其他視圖中的數(shù)據(jù)而導(dǎo)致出現(xiàn)問(wèn)題。如果你想保留數(shù)據(jù),則可以將 saveData 選項(xiàng)傳遞到第三個(gè)參數(shù)的 $option 數(shù)組中:

$data = [
        'title'   => 'My title',
        'heading' => 'My Heading',
        'message' => 'My Message'
];


echo view('blogview', $data, ['saveData' => true]);

另外,如果您希望 view 方法的默認(rèn)功能是在調(diào)用之間保存數(shù)據(jù),則可以在 app/Config/Views.php 中將 $saveData 設(shè)置為 true

創(chuàng)建循環(huán)

傳入視圖文件的數(shù)據(jù)不僅僅限制為普通的變量,你還可以傳入多維數(shù)組,這樣你就可以在視圖中生成多行了。例如,如果你從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù), 一般情況下數(shù)據(jù)都是一個(gè)多維數(shù)組。

這里是個(gè)簡(jiǎn)單的例子,將它添加到你的控制器中:

<?php namespace App\Controllers;


class Blog extends \CodeIgniter\Controller
{
        public function index()
        {
                $data = [
                        'todo_list' => ['Clean House', 'Call Mom', 'Run Errands'],
                        'title'     => "My Real Title",
                        'heading'   => "My Real Heading"
                ];


                echo view('blogview', $data);
        }
}

現(xiàn)在打開(kāi)視圖文件并創(chuàng)建一個(gè)循環(huán):

<html>
<head>
        <title><?= $title ?></title>
</head>
<body>
        <h1><?= $heading ?></h1>


        <h3>My Todo List</h3>


        <ul>
        <?php foreach ($todo_list as $item):?>


                <li><?= $item ?></li>


        <?php endforeach;?>
        </ul>


</body>
</html>
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)