2014-04-02 18 views
1

據這裏的Codeignitor文檔:http://ellislab.com/codeigniter/user-guide/general/hooks.html它指出:pre_controller鉤子不會加載像docs狀態那樣的基類?

pre_controller 立即調用之前,你的任何控制器被調用。所有基類,路由和安全檢查都已完成。

但是,如果我創建一個鉤子鉤pre_controller有:

$hook['pre_controller'][] = array(
'class' => 'tester', 
'function' => 'test', 
'filename' => 'tester.php', 
'filepath' => 'models', 
//'params' => array('beer', 'wine', 'snacks') 
); 

和文件tester.php是:

class tester extends CI_Model 
{ 
    public function __construct() 
    { 
    parent::__construct(); 

    $this->load->library('migration'); 
    } 

    public function test() 
    { 
    echo "hi"; 
    exit; 
    } 
} 

我得到這個錯誤:

Fatal error: Class 'CI_Model' not found in ******.php 

爲什麼是不是加載CI_Model?如果我把一個require_once('system/core/Model.php');在pre_controller定義上面的hooks.php文件,我得到這個錯誤:

Fatal error: Call to a member function library() on a non-object in ****.php 

因爲它不是實際加載CI_Model,功能,例如庫()是行不通的。我如何強迫它引導CI_Model

說「Use post_controller_constructor」的第一個人將會被視爲未被回答的問題。我需要它加載之前,它從控制器類運行任何構造函數。我需要訪問擴展CI_Model類從預控制器掛鉤。

回答

3

簡短的答案是CodeIgniter不能按照您希望的方式工作。在嘗試訪問模型的階段,CodeIgniter尚未加載所需的類,但它不可用。根據你想要達到的目標,可能有另一種方法來實現這一點 - 不使用鉤子/使用稍後的鉤子?

查看/system/core/CodeIgniter.php將顯示每個鉤子何時被調用以及何時執行其他任務;加載路由,加載全局函數等。

如果你堅持使用這個鉤子,那麼你可以在你的模型文件的頂部(在聲明類之前)添加:load_class('Model', 'core');,但這將是一個非常髒的修復。

確保您的班級名稱遵循正確的命名約定 - tester應該是Tester


編輯:只要你想運行在每次調用相同的代碼(假設每個控制器調用),這是一個可能的解決方案:

擴展核心控制器,並使用這個新的控制器爲基礎所有其他控制器的控制器(因爲它們將共享相同的功能)。在這個新的基礎控制器的構造函數中,添加要在每次調用時運行的功能。此構造函數中的代碼將在任何控制器中的任何其他代碼之前調用。

創建以下文件application/core/MY_Controller.php

class MY_Controller extends CI_Controller { 
    function __construct() 
    { 
     parent::__construct(); 
     // Do whatever you want - load a model, call a function... 
    } 
} 

擴展的每個控制器application/controllers,與MY_Controller,而不是CI_Controller

class Welcome extends MY_Controller { 
    function __construct() 
    { 
     parent::__construct(); 
    } 
    // Your controllers other functions... 
} 
+0

骯髒的修復是好的只要它的工作,並不需要一個不同的鉤子:D我很失望,雖然文檔不正確。我會認爲Model類是核心的一部分。即使load_class建議表明它是一個核心項目;)我將在幾分鐘內嘗試這個嘗試,並會報告這是否可行。 – user3488435

+0

那麼,這隻會導致我得到的同樣的錯誤,如果我只是require_once模型類文件不做任何事情。如果我使用這個,我會得到:致命錯誤:在****。php中調用一個非對象的成員函數庫(),我一直在追蹤它,並認爲它與加載器類有關。 – user3488435

+0

我同意這些文檔具有誤導性 - 我會考慮模型的核心部分!對不起,沒有解決它。我已經指出了這個問題 - 在CodeIgniter.php中,第308行,'$ CI = new $ class();'是加載庫所必需的。這是_pre controller_掛鉤之後。在掛鉤前移動它,它應該工作。我不知道是否還有其他影響 - 請自行承擔風險!你究竟在努力實現什麼? – jleft

相關問題