从另一个模块中的控制器扩展控制器?

问题描述:

我有一个名为'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

为什么没有为通用类

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

如果你已经从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