首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

CodeIgniter 視圖層最佳實踐:職責邊界、模板策略與維護技巧

     編輯:PHP 綜合知識

前言:視圖不只是「放 HTML 的地方」

CodeIgniter 視圖 (application/views/) 支援原生 PHP 語法,雖然靈活,但也最容易寫出「意大利麵條式」程式碼。本文釐清視圖層職責邊界,提出四大注意事項與模板引擎選擇建議。

四大核心注意事項

1. 控制器只載入「一個」主視圖

錯誤做法:控制器載入 header、sidebar、content、footer 多個視圖:

// 控制器 - 差
$this->load->view('header');
$this->load->view('sidebar');
$this->load->view('content', $data);
$this->load->view('footer');

缺點:調整版面結構需改動控制器,違反關注點分離。

正確做法:控制器只載入單一佈局視圖,版面組合交給視圖內部:

// 控制器 - 好
$this->load->view('layout/main', $data);

<?php $this->load->view('partials/header'); ?>
<div class="container">
    <?php $this->load->view('partials/sidebar'); ?>
    <main><?php $this->load->view($content_view, $content_data); ?></main>
</div>
<?php $this->load->view('partials/footer'); ?>

優點:版面調整只動視圖,控制器不變;支援多種佈局 (單欄、雙欄、無側欄) 只需切換 $content_view。

2. 視圖中禁用「程式產生 HTML」

錯誤:

// 視圖中 - 差
echo '';

正確:


原則:**HTML 結構用標籤書寫,動態資料用 輸出**。複雜邏輯移至 Helper 或 View Model。

3. 視圖不直接存取資料來源

嚴禁在視圖中出現:

  • $this->db->query(...)
  • $this->Model->get(...)
  • get_instance()->cache->get(...)
  • $_GET/$_POST/$_SESSION 直接讀取

視圖唯一職責:**接收控制器傳遞的資料陣列並呈現**。所有資料準備、權限檢查、格式化在控制器或 Service 完成。

4. 採用模板引擎而非原生 PHP

雖 CI 內建支援 PHP 模板,但建議引入 Twig、Blade、Smarty 等專用模板引擎:

效能差異微乎其微 (模板編譯快取後極快),不應成為不採用理由。

進階技巧:View Model 模式

當視圖需要複雜格式化資料 (如:金額加千分位、日期相對時間、權限判斷顯示/隱藏),建議在控制器建立 View Model 物件:

class PostViewModel {
    private $post;
    
    public function __construct(array $post) {
        $this->post = $post;
    }
    
    public function getTitle() { return html_escape($this->post['title']); }
    public function getFormattedPrice() { return number_format($this->post['price']); }
    public function getRelativeTime() { return timespan($this->post['created_at']); }
    public function canEdit($user_id) { return $this->post['user_id'] == $user_id; }
    // 視圖需要的所有衍生資料...
}

// 控制器
$view_model = new PostViewModel($post);
$this->load->view('post/detail', ['post' => $view_model]);

// 視圖

getTitle() ?>

getFormattedPrice() ?> canEdit($current_user_id)): ?> 編輯

優點:視圖零邏輯、易測試、可複用於 API 回應轉換。

目錄結構建議

application/views/
├── layouts/           # 佈局模板
│   ├── main.php
│   ├── admin.php
│   └── blank.php
├── partials/          # 可複用片段
│   ├── header.php
│   ├── footer.php
│   ├── navbar.php
│   └── flash_messages.php
├── pages/             # 靜態頁面
│   ├── about.php
│   └── contact.php
├── blog/              # 模組視圖 (按控制器分組)
│   ├── index.php
│   ├── detail.php
│   └── _form.php
└── components/        # UI 元件 (配合模板引擎 include)
    ├── button.tpl
    ├── card.tpl
    └── modal.tpl

總結

CodeIgniter 視圖層設計核心在於:**嚴格分離「資料準備」與「呈現邏輯」**。遵循四大原則:

  1. 控制器單一視圖入口
  2. HTML 結構標籤化,資料輸出短標籤化
  3. 視圖零資料存取,零業務邏輯
  4. 採用模板引擎強制約束與安全預設

搭配 View Model 模式處理複雜衍生資料,即可建立清晰、可維護、設計師友善的視圖層架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
痛點原生 PHP模板引擎
變數未定義噴出 Notice/Warning可設定嚴格模式拋出例外
XSS 防護需手動 html_escape()預設自動跳脫 {{ var }}
樣板繼承需自行 include 組合原生支援 extends/block
邏輯限制可寫任意 PHP 程式碼僅允許簡單邏輯,強制業務邏輯前置
設計師協作需懂 PHP 語法語法簡潔,非程式設計師也能修改