Я использую 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 создаст какой-либо экземпляр сервиса?