我使用Propel连接和查询数据库,从symfony 2.7升级到symfony 2.8之后我遇到了一个奇怪的问题。当我完全删除缓存目录的内容然后运行app/console
命令时,我得到了这个例外:
[PropelException] 数据源的运行时配置文件中没有连接信息 [默认]
每当我更改配置或翻译文件然后刷新页面时,也会发生这种情况。当我再次这样做时,它可以正常工作。
我发现这是由我在app/config/config.yml
中传递给twig作为全局变量的服务引起的:
# 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;
}
}
但这通过调用vendor/propel/propel-bundle/Propel/PropelBundle/PropelBundle.php
中的boot()方法在推进负载配置之前发生,这意味着symfony尝试在预热期间实际加载所有包之前创建服务实例。这在symfony 2.7和更早版本中不是问题。通过在构建服务期间不查询数据库可以很容易地避免这种情况,但这是symfony 2.8的正确行为吗?在symfony创建任何服务实例之前,有没有办法强制推进?
答案 0 :(得分:2)
尝试将初始化代码移出构造函数(我知道你已经知道了)。 Symfony在缓存预热过程中比在2.7中执行更多。可能由于Twig模板正在预热而实例化此服务。可能的问题是,Propel本身可能需要一些缓存才能被引导...或者可能有一些代码可以帮助在请求 - 响应周期内正确启动Propel。
简而言之:对我来说这看起来像是一个推杆的怪癖,但是对Propel 有更多了解的人可能知道强行“启动”它的方法。 Propel因其使用的静态上下文而特殊。
我希望澄清一点!