2010-11-07 120 views
3

文本的生命週期是相當長的,這個問題其實很簡單,寫在大膽。其他文本僅用於解釋問題。笨:該控制器

我最近開始使用CodeIgniter的發展我的網站。目前,我正在編寫一個側邊菜單,您可以在視圖中顯示項目(基本電子商務功能)。

我當時的想法是在我的店鋪控制器在哪裏存儲其傳遞到並從我filterview我的濾波值的數組,所以在濾鏡菜單根處理多種類型的過濾器。

的問題是,它似乎是在控制器的構造函數運行的每個控制器被調用時。我認爲,當用戶進入網站時,控制器只構建一次。我在網站開發方面很新,主要是一個C++人,所以這對我來說似乎有點奇怪。

我的問題其實很簡單:這是真的,控制器實例在每次調用控制器功能產生的?否則,我做錯了什麼導致控制器實例在每個控制器調用中被重新實例化...

我希望我的問題不是太模糊。瞭解CodeIgniter的生命週期行爲以便能夠爲此找到一個簡單的解決方案對我來說很重要。我想避免使用$ _SESSION,因爲我想使用類似OOP的解決方案。

+0

嘿...如果你真的想得到很好的幫助,你應該發佈你的代碼。就在蝙蝠之後,聽起來你正在做一些你可能不應該做的事情,但是很難在沒有看到你的實際代碼的情況下查明問題。 – treeface 2010-11-07 19:02:12

回答

3

是不是真的在每次調用 控制器函數時都創建了控制器 實例?否則, 我是什麼做錯了造成 控制器實例是 在每個控制器 通話重新實例..

是,控制器實例被重新實例每次進行到控制裝置的呼叫時間。在CodeIgniter中,每個用戶與你的應用程序進行交互都不存在控制器的持久化實例(與使用C++構建的單用戶應用程序不同)。你所擁有的是會話管理,在這裏你使用Session變量來存儲持久化到用戶瀏覽器和Web服務器之間的特定會話的數據(more)。另一種方法是使用cookie。我個人比較喜歡使用cookie。

沒有使用$ _SESSION爲您過濾器的目的沒有壞處,而且不反對OOP原則。重要的是,一旦你的控制器實例加載(這就是OOP概念的起點),你如何使用存儲在Session變量中的數據。

0

Shivaas,同樣的答案可以通過模型安全地使用?那麼自動加載模型呢?我的意思是,自動加載它只是一種避免在需要時輸入$ this-> load-> model('the_model')的方法?如果沒有重複使用會話/數據庫,沒有辦法使用單例模式?

private $instance; 

function init_model() { 
    if ($this->instance === NULL) { 
     $this->instance = array(); 
    } 
    return $this->instance; 
} 

一旦init_model退出,類實例被銷燬因此$實例將總是被初始化爲一個新的數組()?