【问题标题】:Zend Framework loads mappers from Application/Model/ instead of application/modelsZend Framework 从 Application/Model/ 而不是 application/models 加载映射器
【发布时间】:2011-10-24 21:52:21
【问题描述】:

我的 zend 应用程序已创建,一切似乎都井然有序,但每次我尝试执行以下操作时:

$accProducts = new Application_Models_AccProductsMapper();

只得到:

警告:include_once(Application/Models/AccProductsMapper.php):无法打开流:第 148 行的 /home/blah/blah/blah/Loader.php 中没有这样的文件或目录

但是,AccProductsMapper.php 文件确实存在于这样的目录中,zend 应用程序中的目录都是小写的。

我花了很多时间寻找解决这个问题的方法,但根本没有好的结果。


Bootstrap.php

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initDoctype()
    {
        $this->bootstrap('view');
        $view = $this->getResource('view');
        $view->doctype('XHTML1_STRICT');
    }

    protected function _initAutoload()
    {
        $moduleLoader = new Zend_Application_Module_Autoloader(array(
            'namespace' => '',
            'basePath' => APPLICATION_PATH));
        $autoloader = Zend_Loader_Autoloader::getInstance();
        $autoloader->registerNamespace(array('App','My_'));
        return $moduleLoader;
    }
}

【问题讨论】:

  • 重命名你的目录。您应该像区分大小写一样工作(即使它们不在您的系统上)。此外,您可以依靠 Zend 中的所有变形来使用 CamelCase。
  • 谢谢老兄!但它不起作用......只得到一个空白屏幕......我在其他控制器中看到调用映射器的方式类似于: $var = new Application_Model_AccProductsMapper();这似乎是可笑的 b/c 所谓的“模型”根本不存在,但是“模型”是不是我做错了什么???另外我在很多帖子中看到他们使用模块,到目前为止我没有,使用模块是必须的???
  • 您尝试创建Application_Models_AccProductsMapper 的实例,而类应该是名称Application_Model_AccProductsMapper(注意模型和模型的区别)。它是 plural 版本小写,是您放置大写 singular 版本的文件夹。所以Foo_Model_Bar这个类位于Foo/models/Bar.php
  • @Jurian Sluiman 是的,没错,单数或复数都得到相同的结果:什么都没有!

标签: zend-framework class frameworks directory mapper


【解决方案1】:

添加到每个模块的标准Zend_Loader_Autoloader_Resource 类在&lt;module-directory&gt;/models 中查找具有类前缀&lt;ModuleNamespace&gt;_Model_ 的模型。

对于默认模块,命名空间在配置的appnamespace 属性中定义(默认为Application)。该目录通常是application

总而言之,在application/models 中创建您的默认模块模型类,类前缀为Application_Model_,例如

<?php
// application/models/AccProductsMapper.php

class Application_Model_AccProductsMapper
{
    // etc

至于你的_initAutoload() 方法,我不知道你在用那个模块加载器做什么,我建议你根本不需要它。您可以在配置文件中注册 PEAR 风格的命名空间,例如

autoloadernamespaces.App = "App_"
autoloadernamespaces.My = "My_"

【讨论】:

  • 这正是我的项目现在的结构,相同的目录、相同的前缀和相同的类名,但仍然收到相同的警告“无法打开流”;顺便说一句,我在 Bootstrap.php 文件中使用了 _initAutoload() 函数,使用 APPLICATION_PATH 作为 basePath
  • @CABP 您的问题另有说明。在您的问题中,您的班级名称使用Models(复数)。它应该是Model(单数)。您可以发布您的_initAutoload() 方法吗?除非您将其他自动加载器添加到堆栈中,否则通常没有任何理由自定义自动加载器
  • @CABP 我已将您的代码移至您的问题中。查看我的更新答案
  • 谢谢老兄!太好了!我会听从你的建议 =) 关于我遇到的问题...好吧,我不得不承认这是我的错误,而且是一个婴儿,只是更改了文件权限,现在可以正常工作了,非常感谢!!!
猜你喜欢
  • 1970-01-01
  • 2016-04-07
  • 2016-05-30
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 2022-06-30
  • 1970-01-01
  • 2023-02-22
相关资源
最近更新 更多