2013-10-04 47 views
0

我有一個名爲prefix_Exceptions.php的應用程序/核心有一個例外,它具有相同的類名。我試圖從一個控制器拋出此異常,我得到:爲什麼CodeIgniter無法自動載入application/core中的Exceptions文件?

Fatal error: Class 'prefix_Exceptions' not found in user_controller.php 

application/core/prefix_Exceptions.php

<?php 
class prefix_Exceptions extends CI_Exceptions { 
    public function __construct() { 
     parent::__construct(); 
    } 

    public function test() { 
     echo "This is a test."; 
    } 
} 

而且在application/controllers/user_controller.php

<?php 
class User_Controller extends CI_Controller { 
    public function view($id = '0') { 
     $this->load->model('user_model'); 
     $u = $this->user_model->getUser($id); 

     if (!isset($u)) { 
      $this->exceptions->test(); // ??? 
     } 
     echo "Test: $u"; 
    } 
} 

哦,我的前綴設置爲prefix_

$config['subclass_prefix'] = 'prefix_'; 

我已經讀過關於這個問題的十幾個線程,並且他們沒有一個修復我的異常,以便它可以被控制器拋出。

+1

顯示一些代碼... – Mark

+0

我加了兩個文件。 – NobleUplift

+0

我想你是在'application/config/config.php'中爲'$ config ['subclass_prefix'] ='前綴_';'加'前綴? – quantme

回答

6

您的代碼無法正常工作的主要原因是(如錯誤消息所示):您的prefix_invalid_user.php永遠不會加載。 CI不知道加載此文件,因爲您沒有遵循所需的文件命名方案。

如果要擴展內置類,必須使用相同的類名,但將前綴從CI_更改爲MY_(或在您的配置中設置的任何前綴)。

要擴展類CI_Exceptions,您必須將其命名爲MY_Exceptions並將該php文件保存在/application/core/MY_Exceptions.php中。然後,只有這樣,CI纔會自動爲您加載。

但是,您應該也知道CI的異常類實際上並不是用於引發異常(該名稱具有誤導性,但CI_Exceptions可處理錯誤報告)。正如您在/system/core/Exceptions.php文件中看到的那樣,CI_Exceptions類不會擴展PHP的本機Exceptions類,這對於創建自定義的可拋出異常是必需的。

如果你想自定義,可拋異常,你必須爲它們創建自己的包裝器,並將其加載/自動加載爲庫。

編輯:

按業務方案的要求,我加入瞭解決方案,它是簡單地獲取來自CI的內臟類對象的另一半。爲此,我們可以使用load_class函數,如果它已經實例化,它將返回我們的類對象,如果沒有,它將實例化並返回它。

$foo = load_class('Exceptions', 'core', $this->config->item('subclass_prefix')) 

然後我們就可以進入我們的自定義異常類的方法是這樣:

$foo->someMethodName(); 
+0

此外,基於你的問題的第二部分,我不會再試圖拋棄它,但我仍然希望能夠加載它。 – NobleUplift

+0

您將您的文件命名爲prefix_Exceptions.php並將您的類命名爲prefix_Exceptions? – Mark

+0

現在是。如何訪問prefix_Exceptions.php中的方法? – NobleUplift

相關問題