教程 ? 加載靜態(tài)內(nèi)容
注意: 本教程假定你已經(jīng)下載和安裝了CodeIgniter開發(fā)環(huán)境。
首先,你需要?jiǎng)?chuàng)建一個(gè)可以處理靜態(tài)內(nèi)容請(qǐng)求的控制器類??刂破?,是一個(gè)用來代理完成某項(xiàng)任務(wù)的PHP類,它充當(dāng)基于MVC架構(gòu)應(yīng)用程序的“粘合劑”(譯者注:控制器用來粘合/協(xié)調(diào)不同模型和視圖。隨著教程的深入,你會(huì)更深刻的理解這一點(diǎn))。
舉例來說,假設(shè)存在某個(gè)針對(duì)如下URL的請(qǐng)求: http://example.com/news/latest/10
仔細(xì)觀察此URL地址,我們可以猜測(cè)它所完成的任務(wù):存在某個(gè)類名為"news"的控制器,調(diào)用此類下的"latest"方法用來提取10條最新新聞,然后解析顯示在最終瀏覽器頁(yè)面上。在基于MVC架構(gòu)思想的應(yīng)用程序中,我們經(jīng)常會(huì)見到如下典型URL格式:
http://example.com/[控制器類名]/[控制器方法名]/[所需參數(shù)]
在實(shí)際項(xiàng)目中,以上典型格式可能會(huì)存在變化趨于復(fù)雜。但到目前為止,了解這一典型格式已然足夠。
創(chuàng)建一個(gè)控制器文件application/controllers/pages.php,并編寫如下代碼:
你已經(jīng)創(chuàng)建了一個(gè)名為"pages"的類, 包涵一個(gè)視圖的方法,并定義了一個(gè)名為 $page 的參數(shù)。 這個(gè)pages類繼承了CI_Controller類。這就意味著 這個(gè)新的pages類可以繼承CI_Controller (system/core/Controller.php) 類里面定義的方法和變量。
這個(gè)控制器會(huì)成為你的網(wǎng)站程序每次請(qǐng)求的中心。 在非常技術(shù)性的CodeIgniter的討論中,我們把它稱為 超級(jí)對(duì)象。就像任何php類一樣,在你自己的控制器中,使用$this來調(diào)用它,這樣就可以實(shí)現(xiàn)用 $this 來加載所有變量、視圖和對(duì)這個(gè)框架進(jìn)行一般操作。
現(xiàn)在你已經(jīng)創(chuàng)建了自己的第一個(gè)方法,是時(shí)候來做幾個(gè)基礎(chǔ)的頁(yè)面模板了。我們將要?jiǎng)?chuàng)建兩個(gè) "視圖" (模板頁(yè)面) ,也就是頁(yè)面的頁(yè)頭(header)和頁(yè)腳(footer)。
創(chuàng)建頁(yè)頭文件 application/views/templates/header.php ,代碼如下。
頁(yè)頭文件包括在正式加載視圖前需要的基本的HTML代碼。同時(shí),這里還輸出了 $title 函數(shù),一會(huì)兒我們會(huì)在控制器中對(duì)它進(jìn)行定義。現(xiàn)在我們來創(chuàng)建一個(gè)頁(yè)腳 application/views/templates/footer.php ,代碼如下:
為控制器添加邏輯結(jié)構(gòu) (Adding logic to the controller)
之前你創(chuàng)建了一個(gè)控制器并定義了一個(gè)方法view()。這個(gè)方法里定義了一個(gè)參數(shù),它的值是即將加載的頁(yè)面的名稱。靜態(tài)頁(yè)面的模板將被放在 application/views/pages/ 文件夾中。
在那個(gè)文件夾中需要?jiǎng)?chuàng)建兩個(gè)文件,分別為 home.php 和 about.php。在這兩個(gè)文件中敲一些任何你喜歡的內(nèi)容進(jìn)去并保存。如果你喜歡特別不尋常的內(nèi)容,可以試試敲“Hello World!”。
為了能加載那些頁(yè)面,你需要檢查一下它們是否存在:
public function view($page = 'home') { if ( ! file_exists('application/views/pages/'.$page.'.php')) { // 頁(yè)面不存在 show_404(); } $data['title'] = ucfirst($page); // 將title中的第一個(gè)字符大寫 $this->load->view('templates/header', $data); $this->load->view('pages/'.$page, $data); $this->load->view('templates/footer', $data); }
此時(shí),如果頁(yè)面存在,它將被加載,同時(shí),頁(yè)頭和頁(yè)腳也會(huì)顯示出來。如果頁(yè)面不存在,那么就會(huì)顯示404錯(cuò)誤頁(yè)面。
這個(gè)方法中的第一行是檢查文件是否存在的,使用的是PHP自帶的函數(shù) file_exists() 。show_404() 是CodeIgniter中的函數(shù),用來調(diào)用404錯(cuò)誤頁(yè)面。
在頁(yè)頭模板(header.php)中,我們用 $title 變量來自定義頁(yè)面標(biāo)題(<title>)。而這個(gè)變量的值,我們現(xiàn)在在這個(gè)方法中對(duì)它進(jìn)行了定義。不過,我們并沒有將這個(gè)值直接賦給變量,而是將它作為一個(gè)元素賦給了 $data 數(shù)組。
最后一項(xiàng),按照需要顯示的順序來加載那些視圖。 view() 方法中的第二個(gè)參數(shù)是用來傳遞值給視圖的。數(shù)組中的每個(gè)值都被定義成與它關(guān)鍵字相同的一個(gè)變量,如控制器中 $data['title'] 的值就等同于視圖中變量$title。
設(shè)置路由(Routing)
這個(gè)控制器現(xiàn)在可以工作了,在瀏覽器中鍵入后面的地址 [你的網(wǎng)址]index.php/pages/view 就可以看到。輸入 index.php/pages/view/about 也可以看到about頁(yè)面,也是帶頁(yè)頭和頁(yè)腳的哦。
根據(jù)自定義路由的規(guī)則,你也可以自己定義任何控制器和方法的URI,這樣就可以擺脫下面的既定規(guī)則了。
http://example.com/[controller-class]/[controller-method]/[arguments]
我們來試試吧。打開路由文件 application/config/routes.php ,并添加下面兩行代碼,并刪除 $route 數(shù)組中的其他代碼。
$route['default_controller'] = 'pages/view'; $route['(:any)'] = 'pages/view/$1';
在CodeIgniter里,路由規(guī)則是按照從上到下的順序讀取的,而其中設(shè)定路由的請(qǐng)求是第一個(gè)被讀到的。沒有規(guī)則從左到右都是 控制器名斜線(/)方法名 的組合。請(qǐng)求出現(xiàn)的時(shí)候,CodeIgniter就開始最合適的內(nèi)容進(jìn)行匹配,調(diào)用適當(dāng)?shù)目刂破骱头椒?,也可能調(diào)用參數(shù)。
更多關(guān)于路由設(shè)置的信息都在 URI 路由 文檔 里。
回到上面的代碼,第二行是指利用通配符 (:any) 可以使任何請(qǐng)求都能匹配到 $routes 數(shù)組,并且通過參數(shù)傳遞給pages類的view()方法。
現(xiàn)在,訪問下 index.php/about. 看看是不是已經(jīng)能正確地顯示頁(yè)面了呢?贊!
?