2011-12-01 57 views
14

我有class MY_Controller extends CI_Controller和大型配置文件部分的公共邏輯,所以我試圖創建class Profile extends MY_Controller配置文件部分的公共邏輯和所有與本節相關的類應擴展此配置文件類,因爲我明白權利,但是當我試圖創建class Index extends Profile我收到一個錯誤:擴展CodeIgniter中的控制器類

Fatal error: Class 'Profile' not found 

笨試圖找到這個類index.php我正在運行。

我的錯誤在哪裏?或者,也許更好的方法來標記共同的邏輯?

+0

我問同樣的問題[這裏] [1] [1]:http://stackoverflow.com/questions/7982187/codeigniter-extending-common-controller 希望它可以幫助 – luso

回答

24

我認爲你已經把你的MY_Controller放在/ application/core中,並在config中設置前綴。 雖然我會小心使用索引作爲類名。作爲Codeigniter中的函數/方法,它有一個專門的行爲。

如果您希望擴展該控制器,則需要將這些類放在同一個文件中。

例如在/應用程序核心

/* start of php file */ 
class MY_Controller extends CI_Controller { 
    public function __construct() { 
     parent::__construct(); 
    } 
... 
} 

class another_controller extends MY_Controller { 
    public function __construct() { 
     parent::__construct(); 
    } 
... 
} 
/* end of php file */ 

在/應用/控制器

class foo extends MY_Controller { 
    public function __construct() { 
     parent::__construct(); 
    } 
... 
} 

class bar extends another_controller { 
    public function __construct() { 
     parent::__construct(); 
    } 
... 
} 
+0

可能值得一提的是,'MY_Controller'中的方法應該以'_'作爲前綴,以便CI不會路由它們(因爲本質上所有與所有控制器共享的方法都必須是公共的)。 –

+5

當然,共享方法可以被保護而不是公開。所以他們不會被路由,但可以通過擴展控制器訪問。 – manavo

0

要擴展應該活在應用/ CORE目錄中,以便在您的案件中的所有類都My_Controller和簡介應該居住在那裏。所有的 「終點」 控制器將住在應用/ Controllers文件夾

UPDATE

我認錯。擴展類應該存在於同一個文件中。 @ Rooneyl的回答顯示瞭如何實現

+0

我認爲並非所有的控制器都在覈心,但只有基地控制器。 – luso

+0

@luso,我試着把/控制器/核心和Profile&OtherClass(op稱爲索引)/控制器my_controllers。其他類擴展Profile擴展My_controller。拋出錯誤。移動配置文件到/核心,它的作品。你是否能夠將Profile&OtherClass放入/控制器並使其運行? –

+0

@Alexey Gerasimov我已將Profile類移至應用程序/核心文件夾,但沒有任何更改。我收到了同樣的錯誤。它有什麼文件或其他什麼名字有什麼關係?我錯過了什麼? – Yekver

-2

3個版本,這個問題,我決定這是不是一個壞的解決方案經過一番掙扎後...

require_once BASEPATH.'core/Controller.php'; 
require_once APPPATH.'core/MYCI_Controller.php'; 

增加,其中第一系統中存在第二條線/core/CodeIgniter.php

[如果不是太晚了,我強烈反對PHP和/或笨]

+0

評論投票前的原因。 –

+0

這可能是他們喜歡php,如果我冒犯了任何人,我很抱歉。 –

+0

他們不喜歡PHP ......並不是所有的框架都提供文件處理,並且總是需要改進。 –

0

我發現在谷歌這個頁面,因爲我有同樣的問題。我不喜歡這裏列出的答案,所以我創建了自己的解決方案。

1)將您的父類放在core文件夾中。

2)在所有包含父類的類的開頭放置一個include語句。

因此,一個典型的控制器可能是這樣的:

<?php 

require_once APPPATH . 'core/Your_Base_Class.php'; 
// must use require_once instead of include or you will get an error when loading 404 pages 

class NormalController extends Your_Base_Class 
{ 
    public function __construct() 
    { 
     parent::__construct(); 

     // authentication/permissions code, or whatever you want to put here 
    } 

    // your methods go here 
} 

我喜歡這樣的解決方案,創建一個父類的全部意義在於削減代碼重複的原因。所以我不喜歡其他答案,建議將父類複製/粘貼到所有控制器類中。