无法访问模块控制器中的模块表单

时间:2011-02-03 20:34:16

标签: php zend-framework bootstrapping zend-controller zend-framework-modules

我有一个测试模块。在测试模块中,我有一个Form in forms文件夹。

myproject的/应用/模块/测试/形式/ TestForm.php

class Test_Form_TestForm extends Zend_Form {
    //form elements
}

myproject的/应用/模块/测试/控制器/ TestController.php

class Test_TestController extends Zend_Controller_Action {

    public function indexAction() {
        $this->view->form = new Test_Form_TestForm();  // this is generating error
    }
} // end class

控制器中的表单初始化产生以下错误:

Fatal error: Class 'Test_Form_TestForm' not found in C:\wamp\www\student\application\modules\notification\controllers\NotificationController.php on line 16

如何在控制器中访问此表单。相同类型的案例使用默认控制器。我知道我必须使用Form_指示器在bootstrap中注册我的模块,但不知道确切的语法。

5 个答案:

答案 0 :(得分:4)

为了让Zend Autoloader适用于您的模块,您需要为所有模块提供引导,并且还需要初始化模块资源。

所以,在你的application/modules/test/Bootstrap.php

class Test_Bootstrap extends Zend_Application_Module_Bootstrap {}

<强> UPD:

在您的application/configs/application.ini

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"    
resources.modules[] = 

有关模块here

中自动加载的详细信息

答案 1 :(得分:4)

您还可以在一个Bootstrap文件中的单独函数中初始化多个模块,如:

protected function _initAutoloaders() {

        $test_loader = new Zend_Application_Module_Autoloader( array(   'namespace' => 'Test',
                                                                            'basePath'  => APPLICATION_PATH . '/modules/test'
        ));


      $mynew_loader = new Zend_Application_Module_Autoloader( array(    'namespace' => 'Mynew',
                                                                            'basePath'  => APPLICATION_PATH . '/modules/mynew'
        ));
}

答案 2 :(得分:2)

Vika对如何设置模块自动加载器的答案是正确的。

您的错误表明在NotificationController控制器下的通知模块中找不到表单类。

所以你需要为通知模块提供引导类

application/modules/notification/Bootstrap.php:

class Notification_Bootstrap extends Zend_Application_Module_Bootstrap {}

答案 3 :(得分:1)

我不知道这是不是最好的方式,但它确实有效。

在你的引导程序中

...
$autoloader = new Zend_Loader_Autoloader_Resource(array('namespace' => '', 'basePath' => APPLICATION_PATH));
$autoloader->addResourceType('Test_Form', '/test/forms', 'Test_Form');
...

答案 4 :(得分:1)

维卡的回答似乎是正确的。

如果您仍然遇到问题,请尝试修改 application.ini

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.moduleDefault = "test"
resources.modules[] = "test"
resources.modules[] = "other"

如果在资源列表中指定了确切的模块名称,Zend将自动神奇地注册表单和其他资源自动加载器。在调试的情况下,应该触发 modules / test / Boostrap.php 并且内部的任何_init方法。玩得开心。