2012-08-15 97 views
6

我在笨2.1.0應用程序中有此錯誤控制器調用來自相同的方法相同的靜態方法:無法從同一個類

<?php 

class Error extends CI_Controller 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function index() 
    { 
     set_status_header(404); 
     $data->menuItems = Main::_menu(); 
     $data->title = "404 error !"; 
     $data->pageview = 'templates/404'; 
     $this->load->view('templates/main', $data); 
    } 

    public function facebook() 
    { 

     set_status_header(404);    
     $data->menuItems = Main::_menu(); 
     $data->title = "Facebook error !"; 
     $data->pageview = "templates/facebook_error"; 
     $this->load->view('templates/main', $data); 
    } 
} 
?> 

的Maincontroller _menu:

<?php 
class Main extends CI_Controller 
{ 
    // ... a lot of methods here ... 
    public static function _menu() 
    { 
      static $menuItems = array(//just a simple array 
            ); 
    } 
} 
?> 

的Facebook()方法與index()完全相同,但是索引工作正常,facebook()會拋出以下消息:

Fatal error: Class 'Main' not found in /var/www/MYApplicationName/application/controllers/error.php on line 22 

地球怎麼可能?我怎樣才能從facebook()方法達到Main::_menu()

+1

是否包含MainController文件?該錯誤意味着它無法找到該類,通常是因爲類文件未包含在腳本中。 – DavidS 2012-08-15 10:09:32

+0

這是整個Error類。 index()方法中沒有額外的代碼。如果這兩者是相同的,但如果不能調用其他的可能性,那又如何呢?或者是index()方法是一個特殊的方法?是的,我知道如何包括一些東西,但我的問題是如何可能的索引()的作品? – kissgyorgy 2012-08-15 10:13:23

+0

「Main」類在哪裏? – PeeHaa 2012-08-15 10:21:14

回答

1

基於@TheShiftExchange的答案,我能夠追蹤到路由設置引起了這種行爲。我config/routes.php看起來是這樣的:

$route['404_override'] = 'error/index'; 
$route['(:any)'] = "main/$1"; 

所以,當我做出www.example.com/nonexistent-url請求此得到由main控制器服務,然後CI注意到,有這樣的沒有方法,因此跑error/index過,但main控制器當時已經裝載。

另一種方法facebook從的main現有方法重定向只,例如gallery,這種方式很喜歡,如果我去了網址www.example.com/error/facebook,所以沒有加載main控制器,因爲只有error/facebook請求。如果我撥打www.example.com/error/index,它的工作原理是一樣的,因爲在這種情況下,main控制器未加載,只有error

(賞金去@TheShiftExchange,因爲他的回答是最準確和提供我能跟蹤的最佳信息下來的問題。謝謝!
我的一個重定向從來沒有達到,我因子評分被調用錯誤/索引頁。)

1

從另一個控制器調用函數會中斷MVC並將您置於HMVC領域。

請看看this thread,以及CodeIgniter的Modular Extensions (HMVC) Plugin如果你真的需要這樣做。

+0

好主題,謝謝。我想我在這裏得到了我的老問題的答案:http://codereview.stackexchange.com/questions/11277/where-to-put-menu-items-in-mvc-with-php-model-or-controller – kissgyorgy 2012-08-15 16:56:36

1

爲什麼不創建MY_Controller,它擴展了CI_Controller,在其中放置可重用代碼?

1

其實 - 你錯了。你的「索引」代碼也不起作用。

我剛剛將上面的所有代碼都粘貼到了一個乾淨的CI 2.1.2版本,並且索引函數ALSO返回相同的錯誤。

因此,也許你的電腦有緩存的東西,或者你有其他的代碼讓你認爲它正在工作。但它不起作用。

無論如何 - 真正的問題是你爲什麼要從另一個控制器調用控制器?這不是一個好的MVC方法。你的「_menu()」函數應該位於library - 它屬於它的位置。

或者將_menu()代碼放到「MY_Controller」中並讓兩個控制器都擴展MY_Controller

或將_menu()代碼放入helper

基本上有三種更好的方法可以解決這個問題。

+0

到目前爲止的最佳答案,我檢查它,也許緩存是原因...也感謝您的建議,我已經把菜單放入模型中。 – kissgyorgy 2012-08-19 05:57:43