这是正在发生的事情。蒂姆喷泉是正确的。application.ini 文件中的以下行是罪魁祸首。如果您删除它,您的应用程序应该可以正确加载。
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
您可能还必须删除此行,因为它也是前端控制器的一部分。
resources.frontController.params.displayExceptions = 1
但是您还有 2 个其他选项可以使用Zend_Controller_Front::getInstance()
选项 1。您将 index.php 更改为引导特定资源:
$application->bootstrap(array('FrontController', 'ModuleConfig'))->run();
这将首先从您的 application.ini 引导您的 FrontController,然后运行您的initModuleConfig
方法。本质上,这允许您控制加载哪些资源以及以什么顺序加载。当您拥有只想在特定时间引导的资源时,这很有帮助。
我认为如果您在这里没有为引导方法提供数组,那么它将init
按照声明的顺序调用所有前缀为前缀的方法。
选项 2。您可以在 application.ini 中配置您的模块目录
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.params.prefixDefaultModule = 1
resources.frontController.params.displayExceptions = 1
这将完成您在代码中尝试执行的操作。需要注意的一件事是,您可能希望在Bootstrap
类的构造函数中引导 FrontController。这是以防万一您需要在自定义初始化期间使用它。
现在这里解释一下为什么选项 1 有效。
这是一种方法Zend_Application_Bootstrap_BootstrapAbstract
protected function _bootstrap($resource = null)
{
if (null === $resource) {
foreach ($this->getClassResourceNames() as $resource) {
$this->_executeResource($resource);
}
foreach ($this->getPluginResourceNames() as $resource) {
$this->_executeResource($resource);
}
} elseif (is_string($resource)) {
$this->_executeResource($resource);
} elseif (is_array($resource)) {
foreach ($resource as $r) {
$this->_executeResource($r);
}
} else {
throw new Zend_Application_Bootstrap_Exception('Invalid argument passed to ' . __METHOD__);
}
}
当_bootstrap
您调用公共bootstrap
方法时会调用它。示例$this->bootstrap("FrontController")
或$this->bootstrap()
;
请注意不传入参数的情况。这将称为null
您遇到的情况index.php
-$application->bootstrap()->run();
首先它会加载你的class resources
,然后它也会调用你的plugin resources
. 请注意,plugin resources
在其他情况下不会加载 。
如果你按照类资源的方法调用,它基本上是init
在你的引导调用类中调用你的方法。
插件资源随后被调用,并且是插件资源之一。我不完全确定所有插件资源是如何加载的,但我相信您的application.ini
文件中有一个来源。这些将以 . 开头的行resources
。示例包括视图、前端控制器、数据库。
因此,在您调用的情况下$application->bootstrap()->run();
,您的init
方法首先被加载。但是你FrontController
还没有被引导。它最终被引导为插件资源,取自您的application.ini
. 这显然会覆盖您在引导类中所做的事情。
您可能会问的另一个问题是,为什么在$this->bootstrap("FrontController)
显式调用时 FrontController 实例没有被覆盖。我想这很明显,但就我个人而言,我自己也有这个问题。
在 Bootstrap 类中,有一个方法被调用_executeResource
,它将检查资源是否已经被引导。它使用关联数组来跟踪。关联数组称为$this->_started
。
这就是为什么在您显式引导前端控制器的第一种情况下不调用前端控制器的插件资源的原因。因此,您的前端控制器实例不会被替换。