понедельник, 19 декабря 2011 г.

The "default" context does not exist и symfony doctrine:data-dump

Если вы не видели подобных сообщений в CLI symfony - вы счастливчик. Если да - рассмотрим workaround для борьбы с подобными капризами.

Если вы читаете это, скорее всего у вас вылетела ошибка при попытке выполнить эту команду (либо подобную ей):

./symfony doctrine:data-dump

Непродолжительное гугление показало, что, во-первых, панацеи нет, во-вторых - ноги растут из использования sfContext::getInstance() в классах модели. Для решения проблемы можно применить следующий workaround:
  1. Для того, чтобы понять где именно обваливается task, запустим команду с волшебным ключиком --trace:

    ./symfony doctrine:data-dump --trace

    После кучи дампов запросов мы увидим уже намозолившую глаза ошибку, а далее trace:

    Exception trace:
    at /var/www/project/lib/vendor/diem/symfony/lib/util/sfContext.class.php:111
    sfContext::getInstance at /var/www/project/lib/model/doctrine/PaymentSystem.class.php:36
    PaymentSystem->getUrl at /var/www/project/lib/vendor/diem/dmCorePlugin/lib/doctrine/record/dmDoctrineRecord.php:612
    dmDoctrineRecord->get at /var/www/project/lib/vendor/diem/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record.php:1908
    Doctrine_Record->toArray at /var/www/project/lib/vendor/diem/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Data/Export.php:165
    Doctrine_Data_Export->prepareData at /var/www/project/lib/vendor/diem/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Data/Export.php:101
    Doctrine_Data_Export->doExport at /var/www/project/lib/vendor/diem/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Data.php:203
    Doctrine_Data->exportData at /var/www/project/lib/vendor/diem/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Core.php:991
    Doctrine_Core::dumpData at /var/www/project/lib/vendor/diem/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Task/DumpData.php:55
    Doctrine_Task_DumpData->execute at /var/www/project/lib/vendor/diem/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Cli.php:516
    Doctrine_Cli->executeTask at /var/www/project/lib/vendor/diem/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Cli.php:498
    Doctrine_Cli->_run at /var/www/project/lib/vendor/diem/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Cli.php:452
    Doctrine_Cli->run at /var/www/project/lib/vendor/diem/symfony/lib/plugins/sfDoctrinePlugin/lib/task/sfDoctrineBaseTask.class.php:64
    sfDoctrineBaseTask->callDoctrineCli at /var/www/project/lib/vendor/diem/symfony/lib/plugins/sfDoctrinePlugin/lib/task/sfDoctrineDataDumpTask.class.php:89
    sfDoctrineDataDumpTask->execute at /var/www/project/lib/vendor/diem/symfony/lib/task/sfBaseTask.class.php:68
    sfBaseTask->doRun at /var/www/project/lib/vendor/diem/symfony/lib/task/sfTask.class.php:97
    sfTask->runFromCLI at /var/www/project/lib/vendor/diem/symfony/lib/command/sfSymfonyCommandApplication.class.php:76
    sfSymfonyCommandApplication->run at /var/www/project/lib/vendor/diem/symfony/lib/command/cli.php:20
    include at /var/www/project/symfony:14

  2. Теперь дело за малым - пойти в метод PaymentSystem->getUrl(), и провести небольшой рефакторинг. Цель - убрать оттуда вызов sfContext::getInstance(), или, если это невозможно, поместить его внутрь условия:

    <?php
    if (sfContext::hasInstance()) {
    sfContext::getInstance();
    }

  3. Так повторяем до тех пор, пока не увидим сообщение:

    >> doctrine Dumped data successfully to: /var/www/project/data/fixtures

1 комментарий:

  1. Еще можно при вызове таска указать опцию application. В этом случае будет создан контекст для указанного приложения, и все заработает. Например
    ./symfony doctrine:data-load --application=frontend

    ОтветитьУдалить