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

CodeIgniter 向 View 傳遞數據的正確姿勢:陣列封裝原理解析

     編輯:PHP 相關知識

核心規則:$this->load->view() 第二參數必須是陣列或物件

CI 內部將第二參數陣列的「鍵」提取為視圖中的「變量名」。直接傳遞非陣列(如 result() 返回的物件陣列)會導致視圖無法訪問預期變量。

錯誤 vs 正確示範

// 錯誤:直接傳遞 result() 物件陣列
$query = $this->db->query("SELECT id, name, url FROM cg_link");
$links = $query->result();
$this->load->view('link', $links); // View 中無 $links 變量,會報錯

// 正確:封裝為關聯陣列
$data['links'] = $links;
$this->load->view('link', $data); // View 中可直接用 $links

單行記錄:row() vs row_array()

$sql = "SELECT id, name, url FROM cg_link WHERE id = 21 LIMIT 1";
$query = $this->db->query($sql);

// 物件風格
$row = $query->row();        // 返回 stdClass 物件
echo $row->name;             // View 中同樣需 $data['row'] = $row;

// 陣列風格(推薦,視圖直接用 $row['name'])
$row = $query->row_array();
$data['row'] = $row;
$this->load->view('link', $data);

進階:多視圖組合與緩存

// 1. 多視圖拼接(第三參數 TRUE 返回字串而非輸出)
$header = $this->load->view('templates/header', $data, TRUE);
$body   = $this->load->view('link', $data, TRUE);
$footer = $this->load->view('templates/footer', $data, TRUE);
echo $header . $body . $footer;

// 2. 視圖片段緩存(需配合輸出緩存或第三方庫)
if (! $cached = $this->cache->get('link_view_' . $cache_key)) {
  $cached = $this->load->view('link', $data, TRUE);
  $this->cache->save('link_view_' . $cache_key, $cached, 3600);
}
echo $cached;

常見誤區

誤區正確認知
以為 $this->db->result() 可直接給 View必須 $data['var'] = $result
以為 row() 返回陣列返回物件,需 row_array() 或視圖用 $row->field
視圖中變量未定義卻不報錯PHP 錯誤等級未含 E_NOTICE,建議開發環境 error_reporting(E_ALL)

最佳實踐:Base Controller 封裝 render()

class MY_Controller extends CI_Controller {
  protected function render($view, $data = [], $return = FALSE) {
    // 自動注入通用變量:當前用戶、CSRF、配置等
    $data = array_merge($this->common_view_data(), $data);
    $this->load->view('templates/header', $data);
    $this->load->view($view, $data);
    $this->load->view('templates/footer', $data);
  }
}

統一入口減少重複代碼,確保每個視圖都能預期到所需變量。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved