【问题标题】:Zend application models are not autoloadingZend 应用程序模型不自动加载
【发布时间】:2011-05-24 00:53:26
【问题描述】:

我开始使用名为 Api 的模块中的模型,使用以下 类名/文件名约定:

filename:  {project}/application/modules/api/models/Account.php
classname: Api_Model_Account

他们很高兴地按预期通过框架自动加载。

我认为其中一些模型会更好, 从组织上讲,在应用程序的模型目录中 可以跨多个模块使用。

我移动了它们并重命名了它们:

filename:  {project}/application/models/Account.php
classname: Application_Model_Account

但是,它们不会自动加载 - PHP 会抛出 class not found。我已经检查并确认了我的 配置({project}/application/configs/application.ini):

[production]
appnamespace = "Application"

因此,应用程序命名空间是“应用程序”,但 application/models 目录没有被自动加载。

只是为了让事情变得更疯狂 - 应用程序/插件中的插件正在自动加载。

测试:

<?php

class Application_Model_ExampleTest extends AMH_Test_PHPUnit_ControllerTestCase
{
    public function testLoad()
    {
        $moduleModel = new Api_Model_Product();
        $plugin = new Application_Plugin_ModuleErrorControllerSelector();
        $applicationModel = new Application_Model_Example();
    }
}

class AMH_Test_PHPUnit_ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
{
    public function setUp()
    {
        $this->bootstrap = new Zend_Application(
            APPLICATION_ENV,
            APPLICATION_PATH . '/configs/application.ini'
        );

        parent::setUp();
    }

    public function tearDown()
    {
        $this->resetRequest();
        $this->resetResponse();

        parent::tearDown();
    }
}

配置:

[production]
appnamespace = "Application"

bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"

includePaths.library = APPLICATION_PATH "/../library"

phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
phpSettings.date.timezone = "Australia/Adelaide"


resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.params.displayExceptions = 0
resources.modules[] = ""

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

相关文件夹路径:

<project name>/
    application/
        models/
            Example.php
        modules/
            api/
                models/
                    Product.php
        plugins/
            ModuleErrorControllerSelector.php

错误信息:

PHP Fatal error:  Class 'Application_Model_Example' not found in /var/www/accounts.amh.localhost/tests/application/models/ExampleTest.php on line 9

这是使用 Zend Framework 1.10(Ubuntu 10.04 软件包)

【问题讨论】:

标签: php zend-framework


【解决方案1】:

不知道为什么这种方式不加载。但另一个建议是您可以在包含路径中设置模型。

set_include_path('.'
    . PATH_SEPARATOR . 'application/models'
    . PATH_SEPARATOR . get_include_path()
);

【讨论】:

    【解决方案2】:

    此方法需要在所有测试中进行,以确保正确引导环境:

    public function setUp()
    {
        $this->bootstrap = new Zend_Application(
            APPLICATION_ENV,
            APPLICATION_PATH . '/configs/application.ini'
        );
    
        parent::setUp();
    }
    

    【讨论】:

    • 您应该将 Zend_Application 实例的配置和引导移动到您的 tests/ 目录中名为 bootstrap.php 的文件中。请参阅 phpunit 命令行工具的 --bootstrap 选项。您还可以通过命令行开关或在 phpunit.xml 配置文件中指定引导文件。这样您就不必将它添加到每个测试中。
    • @jcarouth - 我已经有一个测试引导脚本,但我发现 Zend/PHPUnit 的文档中没有提到上面的代码 - 这就是为什么我把它放在这里作为我的答案。我创建了一个继承自 Zend_Test_PHPUnit_ControllerTestCase 的超类,我所有的测试用例都继承自它。
    【解决方案3】:

    在应用层Bootstrap,你可以配置一个resource loader

    protected function _initAutoloader(){
        $resourceLoader = new Zend_Loader_Autoloader_Resource(array(
            'basePath'      => APPLICATION_PATH,
            'namespace'     => 'Application',
            'resourceTypes' => array(
                'model' => array(
                    'namespace' => 'Model',
                    'path'      => 'models',
                 ),
            ),
        ));
    }
    

    【讨论】:

    • 他们不应该这样做。 ZF 使用配置的 appnamespace 属性自动添加其中之一
    • 我会试一试 - 但就像@Phil 所说,我不应该在我使用的 ZF 版本中需要这个。
    • @Phil Brown, @HorusKol:是的,你是对的。只是仔细观察了 Z_A_B_B。确实很神秘。
    【解决方案4】:

    就我而言,这完全是关于一个大写字母。 Model_DbTable_User -> Model_DBTable_User 修复了这个错误。 Model_DbTable_User 在我的本地工作,但不在服务器上!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多