2011-05-05 216 views
6

我有一個名爲'olo'的模塊來處理我們所有的在線訂購內容。從另一個模塊中的控制器擴展控制器?

現在我已經創建了一個名爲'olosec'的新模塊,因爲我希望製作一個不同的版本,只需稍微改變流程,並在一些控制器中進行其他更改。

我有可能在'olo'中使用控制器在'olosec'中擴展控制器嗎?

截至目前我已經試過

class Olosec_CartController extends Olo_CartController 

會拋出像

Warning: include_once(Olo/CartController.php): failed to open stream: 
No such file or directory in /httpdocs/library/Zend/Loader.php on line 146 Warning: 
include_once(): Failed opening 'Olo/CartController.php' for inclusion. 
bla bla bla (include path) bla bla bla 

我的目錄結構的錯誤是這樣的(感謝tree \F \AEditPlus++

+---application 
| +---views 
| | +---scripts 
| | +---layouts 
| | | +---default 
| | | +---admin 
| | +---languages 
| | +---helpers 
| +---modules 
| | +---admin 
| | +---mobile 
| | +---olo 
| | | +---controllers 
| |  |  IndexController.php 
| |  |  MenuController.php 
| |  |  CartController.php 
| |  |  OrderlistController.php 
| | | | 
| | | +---models 
| | | \---views 
| | |  +---helpers 
| | |  \---scripts 
| | |   +---index 
| | |   +---menu 
| | |   +---cart 
| | |   \---orderlist 
| | \---olosec 
| |  +---controllers 
| |  |  IndexController.php 
| |  |  MenuController.php 
| |  |  CartController.php 
| |  |  OrderlistController.php 
| |  | 
| |  +---models 
| |  \---views 
| |   +---helpers 
| |   \---scripts 
| |    +---index 
| |    +---menu 
| |    +---cart 
| |    \---orderlist 
| +---models 
| +---controllers 
| \---configs 
+---library 
+---public 
| +---cli 
| \---default 
+---tests 
\---data 

更新

我已經使用這個 「討厭的」 黑客其中工程

require_once(APPLICATION_PATH . '/modules/olo/controllers/CartController.php'); 

更新@拉克什

我有這個在我的引導..

function _initAutoloader() { 
    $autoloader = Zend_Loader_Autoloader::getInstance(); 
    $autoloader->setFallbackAutoloader(true); 
    return $autoloader; 
} 

在我的application.ini

autoloadernamespaces.0 = "Zend" 
autoloadernamespaces.1 = "My" 
autoloadernamespaces.2 = "Something" 
+0

@Tomalak Geret'kal:有什麼不對勁的問候;)是的,'我'..我總是忘記大寫他們。但感謝編輯! – Phliplip 2011-05-05 12:14:43

+0

雖然你的意思只是要禮貌的問候,因爲堆棧溢出不是一個留言板,我們更喜歡問題只是包含這個問題。它節省空間,避免膨脹,並保持OCD快樂。 :) – 2011-05-05 12:17:17

+0

@Tomalak Geret'kal:我會記住這一點;) – Phliplip 2011-05-05 12:19:39

回答

1

爲什麼沒有爲通用類

application/ 
    library/ < for common classes 

如果您使用不僅在一個控制器,但是在你的項目很多地方,這是一個很好的方法有些類的自定義庫文件夾。

您只需在助推文件中將這個新的application/library/文件夾添加到您的include path

另一種方法是有一個行動助手。但正如我所描述的常見的類文件夾應該是一個很好的解決方案。不過,我發現了一些有趣的資源,其中大部分是關於跨模塊的編碼,但它們可以幫助你反正http://zend-framework-community.634137.n4.nabble.com/Code-re-use-across-modules-td668554.htmlHow to Use Same Models in Different Modules in Zend Framework?


讓我描述的另一種方法

class BasicController extends Zend_Controller_Action 
{ 
    public static $variable = ''; 

    public function init() 
    { 
     self::$variable = 'assign value'; 
    } 
} 

class HomeController extends BasicController 
{ 
    public function indexAction() 
    { 
     $bioVar = parrent::$variable; 
    } 
} 

這比簡單地擴展控制器更好因爲它們表示動作並且每個動作都有相應的視圖腳本。但是所有的類都應該在自動加載器中註冊。

+1

我已經有相當廣泛的庫,但控制器類中的東西我不會考慮作爲放入庫中的東西 - 我理解你的想法。但是我將該庫視爲一個工具箱,可以在另一個項目上重用,而控制器則是處理視圖腳本的流,輸入,模型處理和準備數據的類。 – Phliplip 2011-05-05 10:48:48

+0

看看我的編輯。 – 2011-05-05 11:12:47

1

如果你已經從Zend Autoloader實例化類,錯誤應該消失。

您的引導程序中應該包含以下代碼。PHP文件:

protected function _initAutoloader() 
{ 
    $autoloader = new Zend_Application_Module_Autoloader(array(
     'namespace' => '', 
     'basePath' => APPLICATION_PATH . '/modules', 
    )); 
    return $autoloader; 
} 

在一般情況下,控制器通過裝化Zend_Controller_Dispatcher,你應該使用Zend_Application_Module_Autoloader從其他控制器類實例化。

+0

我用我的引導代碼更新了我的問題。 – Phliplip 2011-05-25 13:15:35

+0

你可以試試上面的一個嗎?讓我知道這是否有效。 – 2011-05-26 10:02:40

+1

其實我決定將訂單模塊擴展到我的移動模塊,可能是一個非常糟糕的主意,因爲它是一個不同的平臺。所以剛剛去了一個'空白'模塊,並複製我需要的位。但是擴展模塊的想法可能是一個很好的主意,讓我們來說一個文章/新聞模塊。 – Phliplip 2011-05-27 08:33:26

相關問題