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

时间:2011-05-05 08:02:47

标签: php zend-framework zend-autoloader

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

更新@Rakesh

我在我的引导程序中有这个...

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

在我的application.ini

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

2 个答案:

答案 0 :(得分:1)

为什么没有公共类的自定义库文件夹

application/
    library/    < for common classes

如果您不仅在一个控制器中使用某些类,而且在项目中的许多位置使用这是一个很好的方法。

您只需将此新application/library/文件夹添加到boostrap文件中的include path即可。

另一种方法是拥有一个动作助手。但正如我所描述的那样,common classes文件夹应该是一个很好的解决方案但是我发现了一些有趣的资源,其中大部分都是关于跨模块编码的,但它们可能会帮助你[{3}}和http://zend-framework-community.634137.n4.nabble.com/Code-re-use-across-modules-td668554.html


让我描述另一种方法

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 :(得分:1)

如果您已从Zend Autoloader实例化该类,则该错误应该消失。

您的bootstrap.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从其他控制器实例化该类。