W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
Note: 本教程假設(shè)你已經(jīng)下載好 CodeIgniter,并將其 安裝 到你的開(kāi)發(fā)環(huán)境。
首先你需要新建一個(gè) 控制器 來(lái)處理靜態(tài)頁(yè)。控制器就是用來(lái)幫助你完成工作的一個(gè)簡(jiǎn)單的類,它是你整個(gè) Web 應(yīng)用程序的”粘合劑”。
例如,當(dāng)訪問(wèn)下面這個(gè) URL 時(shí):
根據(jù)此 URL 我們可以推測(cè)出有一個(gè)名稱為 “news” 的控制器,被調(diào)用的方法為 “l(fā)atest”,”latest” 方法的作用應(yīng)該是查詢10條新聞條目并展示在頁(yè)面上。 在MVC模式里,你會(huì)經(jīng)??吹较旅娓袷降?URL:
http://example.com/[controller-class]/[controller-method]/[arguments]
在正式環(huán)境下 URL 的格式可能會(huì)更復(fù)雜,但現(xiàn)在,我們只需要知道這些就夠了。
新建一個(gè)文件 application/Controllers/Pages.php,然后添加如下代碼:
<?php
class Pages extends CodeIgniter\Controller {
public function view($page = 'home')
{
}
}
你剛創(chuàng)建了一個(gè) Pages
類,有一個(gè)方法 view 并可接受一個(gè) $page 的參數(shù)。Pages
類繼承自 CodeIgniter\Controller
類,這意味著它可以訪問(wèn) CodeIgniter\Controller
類 (system/Controller.php) 中定義的方法和變量。
控制器將是你 Web 應(yīng)用程序中處理請(qǐng)求的核心。和其他的 PHP 類一樣,可以在你的控制器中使用 $this
來(lái)訪問(wèn)它。
現(xiàn)在,你已經(jīng)創(chuàng)建了你的第一個(gè)方法,是時(shí)候創(chuàng)建一些基本的頁(yè)面模板了。我們將新建兩個(gè) “views” (頁(yè)面模板) 分別作為我們的頁(yè)頭和頁(yè)腳。
新建頁(yè)頭文件 application/Views/Templates/Header.php 并添加以下代碼:
<!doctype html>
<html>
<head>
<title>CodeIgniter Tutorial</title>
</head>
<body>
<h1><?= $title; ?></h1>
頁(yè)頭包含了一些基本的 HTML 代碼,用于展示頁(yè)面主視圖之前的內(nèi)容。同時(shí),它還打印出了 $title
變量,這個(gè)我們之后講控制器的時(shí)候再細(xì)說(shuō)。 現(xiàn)在,再新建個(gè)頁(yè)腳文件 application/Views/Templates/Footer.php,然后添加以下代碼:
<em>© 2016</em>
</body>
</html>
你剛新建的控制器中有一個(gè) view()
方法,這個(gè)方法可接受一個(gè)用于指定要加載頁(yè)面的參數(shù)。靜態(tài)頁(yè)面的模板目錄為:application/Views/Pages/。
在該目錄中,新建 Home.php 和 About.php 模板文件。在每個(gè)文件中任意輸入一些文本然后保存它們。如果你不知道寫(xiě)什么,那就寫(xiě) “Hello World!” 吧。
為了加載這些界面,你需要檢查下請(qǐng)求的頁(yè)面是否存在:
public function view($page = 'home')
{
if ( ! file_exists(APPPATH.'/Views/Pages/'.$page.'.php'))
{
// Whoops, we don't have a page for that!
throw new \CodeIgniter\PageNotFoundException($page);
}
$data['title'] = ucfirst($page); // Capitalize the first letter
echo view('Templates/Header', $data);
echo view('Pages/'.$page, $data);
echo view('Templates/Footer', $data);
}
當(dāng)請(qǐng)求的頁(yè)面存在時(shí),將給用戶加載并展示出一個(gè)包含頁(yè)頭頁(yè)腳的頁(yè)面。如果不存在,會(huì)顯示 “404 Page not found” 的錯(cuò)誤頁(yè)面。
此事例方法中,第一行用以檢查界面是否存在,file_exists()
是原生的 PHP 函數(shù),用于檢查某個(gè)文件是否存在。PageNotFoundException
是 CodeIgniter 的內(nèi)置函數(shù),用來(lái)展示默認(rèn)的錯(cuò)誤頁(yè)面。
在頁(yè)頭模板文件中,$title
變量代表頁(yè)面的自定義標(biāo)題,它是在方法中被賦值的,但并不是直接賦值給 title 變量,而是賦值給 $data
數(shù)組中的 title 元素。
最后要做的就是按順序加載所需的視圖,view()
方法中的參數(shù)代表要展示的視圖文件名稱。$data
數(shù)組中的每一個(gè)元素將被賦值給一個(gè)變量,這個(gè)變量的名字就是數(shù)組的鍵值。所以控制器中 $data['title']
的值,就等于視圖中 $title
的值。
控制器已經(jīng)開(kāi)始工作了!在你的瀏覽器中輸入 [your-site-url]index.php/pages/view
來(lái)查看你的頁(yè)面。當(dāng)你訪問(wèn) index.php/pages/view/about
時(shí)你將看到包含頁(yè)頭和頁(yè)腳的 about 頁(yè)面。
使用自定義的路由規(guī)則,你可以將任意的 URL 映射到任意的控制器和方法上,從而打破默認(rèn)的規(guī)則: http://example.com/[controller-class]/[controller-method]/[arguments]
讓我們來(lái)試試。打開(kāi)路由文件 application/Config/Routes.php 然后添加如下兩行代碼,并刪除掉其它對(duì) $route
數(shù)組賦值的代碼。
$routes->setDefaultController('Pages/view');
$routes->add('(:any)', 'Pages::view/$1');
CodeIgniter 讀取路由的規(guī)則為從上到下,并將請(qǐng)求映射到第一個(gè)匹配的規(guī)則。每個(gè)規(guī)則都是一個(gè)正則表達(dá)式(左側(cè))映射到一個(gè)控制器和方法(右側(cè))。當(dāng)獲取到請(qǐng)求時(shí),CodeIgniter 首先查找能匹配到的第一條規(guī)則,然后調(diào)用相應(yīng)的可能存在參數(shù)的控制器和方法。
你可以在關(guān)于 URL路由的文檔 中找到更多信息。
路由事例的第二條規(guī)則 $routes
數(shù)組中使用了通配符 (:any)
來(lái)匹配所有的請(qǐng)求,然后將參數(shù)傳遞給 Pages
類的 view()
方法。
為請(qǐng)求默認(rèn)的控制器,你必須確定當(dāng)前路由未被定義或重新編寫(xiě)過(guò)。默認(rèn)的路由文件 does 下存在一個(gè)處理網(wǎng)站根目錄的路由 (/) 規(guī)則.刪除以下的路由來(lái)確保 Pages 控制器可以訪問(wèn)到我們的 home 頁(yè)面:
$routes-&add(‘/’, ‘Home::index’);
現(xiàn)在訪問(wèn) index.php/about
。路由規(guī)則是不是正確的將你帶到了控制器中的 view()
方法?太酷了!
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: