[CodeIgniter4]講解-載入靜態頁

講解

本教程旨在向您介紹CodeIgniter框架和MVC體系結構的基本原理。它將向您展示如何以逐步的方式構造基本的CodeIgniter應用程式。

在本教程中,您將創建一個基本的新聞應用程式。您將從編寫可載入靜態頁面的程式碼開始。接下來,您將創建一個新聞部分,該部分將從資料庫中讀取新聞項。最後,您將添加一個表單以在資料庫中創建新聞項。

本教程將主要關註:

  • 模型-視圖-控制器基礎知識
  • 路由基礎
  • 表格驗證
  • 使用「查詢生成器」執行基本資料庫查詢

整個教程分為幾頁,每頁僅解釋CodeIgniter框架功能的一小部分。您將瀏覽以下頁面:

  • 簡介,此頁面為您提供了預期的概述。
  • 靜態頁面,它將教您控制器,視圖和路由的基礎知識。
  • 新聞部分,您將在這裡開始使用模型,並將進行一些基本的資料庫操作。
  • 創建新聞項,這將引入更高級的資料庫操作和表單驗證。
  • 結論,這將為您提供進一步閱讀和其他資源的一些指示。

享受您對CodeIgniter框架的探索。

載入靜態頁

Note: 本教程假設你已經下載好 CodeIgniter,並將其 安裝 到你的開發環境。

首先你需要新建一個 控制器 來處理靜態頁。控制器就是用來幫助你完成工作的一個簡單的類,它是你整個 Web 應用程式的"粘合劑"。

CI3 需要$this->load->view 現在CI4 view('welcome_message');即可

例如,當訪問下面這個 URL 時:

http://example.com/news/latest/10

根據此 URL 我們可以推測出有一個名稱為 "news" 的控制器,被調用的方法為 "latest","latest" 方法的作用應該是查詢10條新聞條目並展示在頁面上。 在MVC模式里,你會經常看到下面格式的 URL:

http://example.com/[controller-class]/[controller-method]/[arguments]

在正式環境下 URL 的格式可能會更複雜,但現在,我們只需要知道這些就夠了。

新建一個文件 application/Controllers/Pages.php,然後添加如下程式碼:

<?php  class Pages extends CodeIgniterController {            public function view($page = 'home')          {      }  }

你剛創建了一個 Pages 類,有一個方法 view 並可接受一個 $page 的參數。Pages 類繼承自 CodeIgniterController 類,這意味著它可以訪問 CodeIgniterController 類 (system/Controller.php) 中定義的方法和變數。

控制器將是你 Web 應用程式中處理請求的核心。和其他的 PHP 類一樣,可以在你的控制器中使用 $this 來訪問它。

現在,你已經創建了你的第一個方法,是時候創建一些基本的頁面模板了。我們將新建兩個 "views" (頁面模板) 分別作為我們的頁頭和頁腳。

新建頁頭文件 application/Views/Templates/Header.php 並添加以下程式碼:

<!doctype html>  <html>  <head>          <title>CodeIgniter Tutorial</title>  </head>  <body>            <h1><?= $title; ?></h1>

頁頭包含了一些基本的 HTML 程式碼,用於展示頁面主視圖之前的內容。同時,它還列印出了 $title 變數,這個我們之後講控制器的時候再細說。 現在,再新建個頁腳文件 application/Views/Templates/Footer.php,然後添加以下程式碼:

                <em>&copy; 2016</em>          </body>  </html>

在控制器中添加邏輯

你剛新建的控制器中有一個 view() 方法,這個方法可接受一個用於指定要載入頁面的參數。靜態頁面的模板目錄為:application/Views/Pages/

在該目錄中,新建 Home.php 和 About.php 模板文件。在每個文件中任意輸入一些文本然後保存它們。如果你不知道寫什麼,那就寫 "Hello World!" 吧。

為了載入這些介面,你需要檢查下請求的頁面是否存在:

public function view($page = 'home')  {      if ( ! file_exists(APPPATH.'/Views/Pages/'.$page.'.php'))          {                  // Whoops, we don't have a page for that!                  throw new CodeIgniterPageNotFoundException($page);          }            $data['title'] = ucfirst($page); // Capitalize the first letter            echo view('Templates/Header', $data);          echo view('Pages/'.$page, $data);          echo view('Templates/Footer', $data);  }

當請求的頁面存在時,將給用戶載入並展示出一個包含頁頭頁腳的頁面。如果不存在,會顯示 "404 Page not found" 的錯誤頁面。

此事例方法中,第一行用以檢查介面是否存在,file_exists() 是原生的 PHP 函數,用於檢查某個文件是否存在。PageNotFoundException 是 CodeIgniter 的內置函數,用來展示默認的錯誤頁面。

在頁頭模板文件中,$title 變數代表頁面的自定義標題,它是在方法中被賦值的,但並不是直接賦值給 title 變數,而是賦值給 $data 數組中的 title 元素。

最後要做的就是按順序載入所需的視圖,view() 方法中的參數代表要展示的視圖文件名稱。$data 數組中的每一個元素將被賦值給一個變數,這個變數的名字就是數組的鍵值。所以控制器中 $data['title'] 的值,就等於視圖中 $title 的值。

路由

控制器已經開始工作了!在你的瀏覽器中輸入 [your-site-url]index.php/pages/view 來查看你的頁面。當你訪問 index.php/pages/view/about 時你將看到包含頁頭和頁腳的 about 頁面。

使用自定義的路由規則,你可以將任意的 URL 映射到任意的控制器和方法上,從而打破默認的規則: http://example.com/[controller-class]/[controller-method]/[arguments]

讓我們來試試。打開路由文件 application/Config/Routes.php 然後添加如下兩行程式碼,並刪除掉其它對 $route 數組賦值的程式碼。

$routes->setDefaultController('Pages/view');  $routes->add('(:any)', 'Pages::view/$1');

CodeIgniter 讀取路由的規則為從上到下,並將請求映射到第一個匹配的規則。每個規則都是一個正則表達式(左側)映射到一個控制器和方法(右側)。當獲取到請求時,CodeIgniter 首先查找能匹配到的第一條規則,然後調用相應的可能存在參數的控制器和方法。

你可以在關於 URL路由的文檔 中找到更多資訊。

路由事例的第二條規則 $routes 數組中使用了通配符 (:any) 來匹配所有的請求,然後將參數傳遞給 Pages 類的 view() 方法。

為請求默認的控制器,你必須確定當前路由未被定義或重新編寫過。默認的路由文件 does 下存在一個處理網站根目錄的路由 (/) 規則.刪除以下的路由來確保 Pages 控制器可以訪問到我們的 home 頁面:

$routes->add('/', 'Home::index');

現在訪問 index.php/about。路由規則是不是正確的將你帶到了控制器中的 view() 方法?太酷了!