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