2015-12-15 1 views
3

Я использую Propel для подключения и запроса базы данных и после обновления от symfony 2.7 до symfony 2.8. Я столкнулся с странной проблемой. Когда я полностью удалить содержимое каталога кэша, а затем запустить app/console команду я получил это исключение:Содержит ли symfony 2.8 пакеты и сервисы в правильном порядке во время разминки?

[PropelException] Нет Информация о соединении в файле конфигурации среды выполнения для источника данных [по умолчанию]

Это также происходит каждый раз, когда я изменяю файлы конфигурации или перевода, а затем обновляю страницу. Когда я делаю это снова, он работает нормально.

я понял, что это вызвано одной из моей службы, которая передается прут в качестве глобальной переменной, как это в app/config/config.yml:

# Twig Configuration 
twig: 
    debug:   "%kernel.debug%" 
    strict_variables: "%kernel.debug%" 
    globals: 
     settings: @app.settings 

Служба попытаться загружает данные из базы данных в конструкторе:

<?php 
namespace AppBundle\Services; 

use AppBundle\Propel\SettingsQuery; 

class PropelSettings { 
    private $settings = array(); 

    public function __construct() { 
     $this->initialize(); 
    } 

    public function initialize() { 
     $settings = SettingsQuery::create() 
      ->select(array('key', 'value')) 
      ->find(); 

     foreach ($settings as $s) { 
      $this->settigns[$s['key']] = $s['value']; 
     } 
    } 

    public function get($key, $default = null) { 
     return isset($this->settings[$key]) ? $this->settings[$key] : $default; 
    } 
} 

, но это происходит до конфигурации загрузки пропеллера, вызвав метод boot() в vendor/propel/propel-bundle/Propel/PropelBundle/PropelBundle.php, что означает, что symfony пытается создать экземпляр службы, прежде чем он загрузит все пакеты во время разминки. Это не проблема в Symfony 2.7 и более ранних версиях. Этого можно легко избежать, не запрашивая базу данных во время построения службы, но верно ли это поведение Symfony 2.8? Есть ли способ заставить движок загружаться до того, как symfony создаст любой экземпляр службы?

ответ

2

Просто попробуйте перевести код инициализации из конструктора (я знаю, что вы уже знаете это). Symfony делает еще во время процесса прогрева кеша, чем в 2.7. Эта служба создается, вероятно, из-за нагревания шаблонов Twig. Вероятно, проблема заключается в том, что самому Propel, вероятно, нужен какой-то кеш, чтобы он был загружен ... или, возможно, есть некоторый код, который помогает правильно загружать Propel в течение цикла запроса-ответа.

Вкратце: это похоже на причуду Propel для меня, но тот, кто знает больше о Propel , может знает способ принудительно «загружать» его. Propel является особенным из-за статического контекста, который он использует.

Надеюсь, это немного разъяснит!

+0

Спасибо, действительно, я проверил тот же пример сервиса, но на этот раз я использовал доктрину, и он отлично работает, поэтому, вероятно, PropelBundle нуждается в исправлениях для совместимости с symfony 2.8 – KarasQ

Смежные вопросы