2 Stimmen

Zend Framework, phpUnit und Doctrine verursachen Probleme

Zunächst einige grundlegende Informationen:

  • Ubuntu neueste Version
  • Zend Framewrok 1.9.6
  • Doktrin 1.2.1
  • Php unit neueste Version

Ich habe verfolgt este y este Tutorial, um meine Zend-Umgebung mit Doctrine und phpUnit einzurichten.

Bei meiner Umgebung handelt es sich nicht um ein emtpy-Projekt, da ich bereits einige Entwicklungen durchgeführt hatte, bevor ich Doctrine und phpunit konfiguriert habe. Ich habe einige Datenbankklassen in meinem Ordner models/DbTable/ erstellt. Das Problem ist, dass die Dateien in diesem Ordner ein Problem verursachen, wenn phpunit ausgeführt wird.

Ich erhalte folgende Fehlermeldung:

    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

Ich denke, dass die Autoloader von zend Framework, Doctrine und PHPunit sich gegenseitig stören, aber ich bin mir da nicht sicher.

Übrigens ist Zeile 19 der oben genannten Datei (addresses.ph) die letzte Zeile dieser Datei. Ich habe an anderen Stellen nachgesehen, ob sie irgendwo anders manuell eingefügt wurde, aber soweit ich sehen kann, ist sie es nicht

So sieht meine application.ini aus:

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

Es könnte einige zusätzliche Informationen geben.

Deshalb bin ich neugierig, ob jemand eine Lösung für mich hat.

Vielen Dank im Voraus!

1voto

Andresch Serj Punkte 31645

Ich habe das Problem vorübergehend gelöst, indem ich Passthru verwendet und somit die Doctrine Cli außerhalb der PHP-Umgebung ausgeführt habe. Wahrscheinlich ist es weit davon entfernt, eine gute stabile Lösung, aber bis kommen mit etwas anderes, das ist, wie ich es tun:

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

Um dies zu erklären: Ich speichere den Pfad, in dem ich mich befinde, und erstelle dann den Pfad, in dem sich mein ausführbares Skript befindet. Dann wechsle ich in dieses Verzeichnis. passhru führt den Befehl build-all-reload aus, mit -force wegen der Frage "Wollen Sie wirklich ...". Und dann wechsle ich wieder in das ursprüngliche Verzeichnis.

Dadurch erhalte ich eine neue Datenbank, die alle meine Datenvorrichtungen enthält. Sie können diesen kleinen Code starten, wann immer Sie wollen. Kombiniert mit der Lösung im Artikel Datenbankhilfe für PHPUnit auf CodeUtopia Das funktioniert wirklich gut.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X