symfony 2.8在预热期间是否以正确的顺序加载捆绑包和服务?

时间:2015-12-15 20:39:51

标签: symfony propel symfony-2.7 symfony-2.8

我使用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创建任何服务实例之前,有没有办法强制推进?

1 个答案:

答案 0 :(得分:2)

尝试将初始化代码移出构造函数(我知道你已经知道了)。 Symfony在缓存预热过程中比在2.7中执行更多。可能由于Twig模板正在预热而实例化此服务。可能的问题是,Propel本身可能需要一些缓存才能被引导...或者可能有一些代码可以帮助在请求 - 响应周期内正确启动Propel。

简而言之:对我来说这看起来像是一个推杆的怪癖,但是对Propel 有更多了解的人可能知道强行“启动”它的方法。 Propel因其使用的静态上下文而特殊。

我希望澄清一点!