【问题标题】:Forms not found by autoloader in Zend module?Zend 模块中的自动加载器找不到表单?
【发布时间】:2011-08-12 22:32:50
【问题描述】:

我已经厌倦了 Zend 的自动加载器。

我正在尝试从模块结构中的PasswordController 中加载EditPassword,如下所示。

应用程序.ini

includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0
resources.frontController.baseUrl = "/"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"  
phpSettings.date.timezone = "Europe/London"

Bootstrap.php:

public function init() {
    $config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/application.ini', APPLICATION_ENV);
    $baseUrl = $config->baseHttp;
    define('BASE_URL', $baseUrl);
}

protected function _initAutoload() {
    $autoLoader = Zend_Loader_Autoloader::getInstance();
    $autoLoader->registerNamespace('App_');
    //
    $moduleLoader = new Zend_Application_Module_Autoloader(array(
            'namespace' => '',
            'basePath' => APPLICATION_PATH . 'modules/account',
            'resourceTypes' => array(
                    'form' => array(
                            'path' => 'forms',
                            'namespace' => 'Form'))));
    $autoLoader->pushAutoloader($moduleLoader);
    //
    return $autoLoader;
}

我正在像这样在控制器中加载表单:

$form = new Account_Form_EditPassword();
$this->view->form = $form;

错误本身是:

Fatal error: Class 'Account_Form_EditPassword' not found in 
Z:\dat\docs\workspace\metamusic\application\modules\account\controllers\PasswordController.php
on line 7

我做错了什么? Zend 中的其他所有内容似乎都使用了相当合理的默认值 - 我真的必须为每个模块声明 all 到表单/模型/viewhelpers 的路径,因为它们遵循默认的 Zend 结构,并且在默认模块目录中?

【问题讨论】:

  • 用你在控制器中加载表单的方式更新你的问题
  • 已经完成了。可以肯定的是,我正在使用命令行工具创建表单模板,并且自动完成填写正确的名称。
  • 看起来不错。抱歉,您得到的确切错误是什么?
  • 我已经更新了这个问题,但恐怕这个错误的描述性不是很好。
  • 'account' 的拼写在引导程序中拼写错误,它的 'acount' 缺少一个 'c'。

标签: forms zend-framework module zend-autoloader


【解决方案1】:

我会从应用程序 Bootstrap 中删除所有模块自动加载代码,然后在 application/modules/account/Bootstrap.php 中实现一个空模块引导程序:

class Account_Bootstrap extends Zend_Application_Module_Bootstrap
{
}

然后在application/configs/application.ini 中,添加以下内容:

resources.modules[] = 

这里的想法是Zend_Application_Module_Bootstrap 自动注册一个资源自动加载器,其中包含一组常见的路径/命名空间映射,包括您正在使用的表单的映射。

【讨论】:

  • 我必须在某处声明该引导程序吗?我已经按照您的建议进行了尝试,但是其中的 initSomething() 函数没有被调用,好像 Zend 没有意识到它的存在。
  • 啊啊,您可能必须启用application.ini 中的模块。更新答案。
  • 嘿,确保您的 application.ini 中有以下两行 resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"resources.modules[] = ,我必须添加 frontController 行才能使其正常工作。
  • 非常有帮助!我很惊讶 zendtool 不会自动创建引导文件。关于为什么我可以加载控制器/视图而不是模型/表单等,我一直在摸不着头脑。
【解决方案2】:

Bootstrap.php

'basePath' => APPLICATION_PATH . 'modules/acount'

应该是:

'basePath' => APPLICATION_PATH . 'modules/account'

其他一切正常

【讨论】:

    【解决方案3】:

    如果这是您实际配置的复制/粘贴,那么您在 'modules/acount' 中有错字

    'basePath' => APPLICATION_PATH . 'modules/acount',
    

    根据您的 ZF 版本,您甚至不需要引导程序中的自动加载器。你可以删除它。您的 ini 中的以下内容也是如此。

    resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
    

    【讨论】:

    • 感谢您的持续投入。我已经解决了这个问题,但无济于事。我正在使用最新的稳定版(1.11),所以大概 ini 中的那一行是为了抵消我的错字。
    • @danH 我会说这是你的 initAutoload() 的另一种方式是抵消 iniconfig。您是否在引导程序中删除了自动加载器?
    • 是的,没有运气。为了确定,绝对删除了引导加载程序中的所有其他内容,但没有改变。顺便感谢您的帮助,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多