2012-04-18 40 views
2

我正在开发一个带有一些模块的Zend Framework MVC应用程序,例如Users模块。有一个模型类名称“Users_Model_User”,可以在任何模块/控制器操作中使用。但我需要使用应用程序中的引导类模型的实例,但我得到一个异常:如何在基于Zend Framework的应用程序的应用程序引导程序中使用模块中的模型类?

Fatal error: Class 'Users_Model_User' not found in /my/path/...

我对每个模块的引导类:

class Users_Bootstrap extends Zend_Application_Module_Bootstrap { 

    protected function _initAutoloader() { 
     $autoloader = new Zend_Application_Module_Autoloader(array(
        'namespace' => 'Users_', 
        'basePath' => APPLICATION_PATH . '/modules/users' 
       )); 

     return $autoloader; 
    } 

} 

和我说,模块正常工作(reciving requests,处理和返回响应)。我认为这很好,因为模块引导类,负责加载默认模块资源,如模型类。但主Bootstrap类似乎缺乏对“用户”模块模型类的访问。

回答

1

你可以尝试(不知道它会工作)

protected function __initSomething() 
{ 
    $this->bootstrap('autoload'); 
    $model = new Users_Model_User(); 
    ... 
} 

我不t认为引导是一个很好的地方做mysql查询,你应该使用 a Zend_Controller_Plugin_Abstract,这样的资源启动和引导自动加载工作(我使用插件我自己做查询和检查权限... )

+0

我想你的解决方案,并没有奏效: 致命错误:未捕获的异常“Zend_Application_Bootstrap_Exception”有消息“资源匹配的‘自动加载’找不到”在/我的/路径... 另外,我的模型类是不适用于SQL查询。它只保存用户的属性集。 你的建议也不错。我将使用一个插件来设置我所需要的,使用User模型类,即当前应用程序的用户。 – 2012-04-18 15:59:27

+1

尝试改变this-> bootstrap('autoloader')而不是this-> bootstrap('autoload')(因为你的函数名为_initAutoloader而不是_initAutoload) – max4ever 2012-04-18 16:15:48

+0

是的,你是对的。这工作得很好。谢谢。 – 2012-04-18 21:31:16

3

Users_Bootstrap在您的应用程序引导后执行,这意味着您的应用程序引导中尚未执行您的_initAutoloader()方法。

解决方案可能是将您的代码从_initAutoloader()移到您的主引导程序。这将解决您的问题!你也可以将主引导程序中的一段代码指向模块引导程序,这对我来说更有意义。请注意,所有模块引导始终被称为,与当前请求的模块无关。

而且,让我与你this article关于ZF引导过程分享,希望它会帮助你;)

+0

谢谢你的回答。实际上,将_initAutoloader()方法移动到主引导类不起作用。我仍然得到“未发现类”异常。顺便说一句,谢谢你的共享文章。这非常有用。 – 2012-04-18 15:54:30

+0

您是否将它移动到使用'Users_Model_User'的方法之上?确保你已经在使用Users_Model_User和'$ this-> bootstrap('autoloader');'的bootstrap方法中引导你的自动加载器。 – Liyali 2012-04-18 17:03:28

相关问题