代码之家  ›  专栏  ›  技术社区  ›  sanders

Zend框架、phpunit和学说导致问题

  •  2
  • sanders  · 技术社区  · 16 年前

    首先是一些基本信息:

    • Ubuntu最新版本
    • Zend框架WROK 1.9.6
    • 教义1.2.1
    • PHP单元最新版本

    我一直在跟踪 this 和 this 教程设置我的Zend环境与学说和phpunit。

    我的环境不是emtpy项目,因为我以前做过一些开发 配置条令和phpunit。我在models/dbtable/文件夹中创建了一些db类。 问题是此文件夹中的文件通过运行phpunit导致问题。

    这是我得到的错误:

        Fatal error: Cannot redeclare class JS_Model_DBTable_Addresses in /var/www/nrka/application/models/DbTable/addresses.php on line 19
    
    Call Stack:
        0.0007      62480   1. {main}() /usr/bin/phpunit:0
        0.1662    4484880   2. PHPUnit_TextUI_Command::main() /usr/bin/phpunit:52
        0.1663    4485612   3. PHPUnit_TextUI_Command->run() /usr/share/php/PHPUnit/TextUI/Command.php:147
        0.1663    4485860   4. PHPUnit_TextUI_Command->handleArguments() /usr/share/php/PHPUnit/TextUI/Command.php:156
        0.1678    4491132   5. PHPUnit_Util_Fileloader::load() /usr/share/php/PHPUnit/TextUI/Command.php:786
        0.1682    4504132   6. include_once('/var/www/nrka/tests/application/bootstrap.php') /usr/share/php/PHPUnit/Util/Fileloader.php:117
        0.2773    7249284   7. Doctrine_Cli->run() /var/www/nrka/tests/application/bootstrap.php:33
        0.2773    7249348   8. Doctrine_Cli->_run() /var/www/nrka/library/Doctrine/Cli.php:452
        0.2789    7259336   9. Doctrine_Cli->executeTask() /var/www/nrka/library/Doctrine/Cli.php:498
        0.2790    7259480  10. Doctrine_Task_BuildAllReload->execute() /var/www/nrka/library/Doctrine/Cli.php:516
        0.5301   11487988  11. Doctrine_Task_LoadData->execute() /var/www/nrka/library/Doctrine/Task/BuildAllReload.php:56
        0.5312   11488028  12. Doctrine_Core::loadData() /var/www/nrka/library/Doctrine/Task/LoadData.php:43
        0.5324   11527112  13. Doctrine_Data->importData() /var/www/nrka/library/Doctrine/Core.php:996
        0.5372   11641772  14. Doctrine_Data_Import->doImport() /var/www/nrka/library/Doctrine/Data.php:222
        0.5375   11642232  15. Doctrine_Data->purge() /var/www/nrka/library/Doctrine/Data/Import.php:115
        0.5375   11642300  16. Doctrine_Core::getLoadedModels() /var/www/nrka/library/Doctrine/Data.php:263
        0.5382   11690076  17. Doctrine_Core::filterInvalidModels() /var/www/nrka/library/Doctrine/Core.php:716
        0.5544   11710976  18. Doctrine_Core::isValidModelClass() /var/www/nrka/library/Doctrine/Core.php:763
        0.5544   11711084  19. class_exists() /var/www/nrka/library/Doctrine/Core.php:784
        0.5546   11711456  20. Doctrine_Core::modelsAutoload() /var/www/nrka/library/Doctrine/Core.php:0
    

    我认为正在发生的是Zend框架、学说和phpunit的自动加载程序互相干扰,但我不确定。

    顺便说一下,上述文件的第19行(addresses.ph)是该文件的最后一行。我已经查过其他地方,不管是在其他地方手动包含的,但据我所知,它不是

    我的application.ini如下所示:

    production]
    phpSettings.display_startup_errors = 0
    phpSettings.display_errors = 0
    
    phpSettings.date.timezone = "Europe/Amsterdam"
    
    includePaths.library = APPLICATION_PATH "/../library"
    bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
    bootstrap.class = "Bootstrap"
    resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
    resources.layout.layoutpath = APPLICATION_PATH "/layouts"
    resources.view.basePath = /var/www/nrka/public/
    autoloaderNamespaces[] = "Doctrine"
    autoloaderNamespaces0 = "JS_"
    
    ;---------
    ;databases
    ;---------
    doctrine.dsn = "mysql://root:root@localhost/zcdev"
    doctrine.data_fixtures_path = APPLICATION_PATH "/configs/data/fixtures"
    doctrine.sql_path           = APPLICATION_PATH "/configs/data/sql"
    doctrine.migrations_path    = APPLICATION_PATH "/configs/migrations"
    doctrine.yaml_schema_path   = APPLICATION_PATH "/configs/schema.yml"
    doctrine.models_path        = APPLICATION_PATH "/models"
    
    resources.db.isDefaultTableAdapter = true
    resources.db.adapter =  mysqli
    resources.db.params.host    = localhost
    resources.db.params.username = root
    resources.db.params.password = root
    resources.db.params.dbname = ladosa
    
    
    
    [staging : production]
    
    [testing : production]
    phpSettings.display_startup_errors = 1
    phpSettings.display_errors = 1
    doctrine.dsn = "mysql://root:root@localhost/zctest"
    
    [development : production]
    phpSettings.display_startup_errors = 1
    phpSettings.display_errors = 1
    

    它可能会提供一些额外的信息。

    所以我很想知道是否有人能为我找到解决方案。

    事先谢谢!

    1 回复  |  直到 15 年前
        1
  •  1
  •   Andresch Serj    16 年前

    我通过使用passthru暂时解决了这个问题,因此在PHP环境之外运行了条令cli。 也许这离成为一个好的稳定的解决方案还很远,但在想出其他办法之前,我是这样做的:

    <?php
    ...
    $tmpDir = realpath(getcwd());
    $newDir = realpath(dirname(__FILE__).'/../../application/scripts/');
    chdir($newDir);
    passthru('./doctrine build-all-reload -force');
    chdir($tmpDir);
    

    为了解释这一点:我存储了我所在的路径,然后生成了我的条令CLI可执行脚本所在的路径。然后我转到那个目录。 passthru 使用-force执行build all reload命令,因为“是否确实要…”问题。 然后我又转到原来的目录。

    这为我提供了一个包含所有数据设备的新数据库。您可以随时启动这个小代码。 与解决方案结合 Article Database helper for PHPUnit on CodeUtopia 这真的很管用。

    推荐文章