Загружает ли symfony 2.8 пакеты и сервисы в правильном порядке во время прогрева?

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

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

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

Я понял, что это вызвано одной из моих служб, которая передается в twig как глобальная переменная, например, в 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? Есть ли способ принудительно загрузить Propel до того, как symfony создаст какой-либо экземпляр сервиса?


person KarasQ    schedule 15.12.2015    source источник


Ответы (1)


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

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

Я надеюсь, что это немного проясняет!

person weaverryan    schedule 15.12.2015
comment
Спасибо, действительно, я проверил тот же пример службы, но на этот раз я использовал доктрину, и она работает нормально, поэтому, вероятно, PropelBundle нуждается в исправлениях для совместимости с symfony 2.8. - person KarasQ; 16.12.2015