手动重新编译Symfony容器



我正在尝试创建一个码头化的symfony应用程序。问题是DI容器是在Docker容器构建过程中构建的,这意味着我无法真正将运行时参数注入其中。到目前为止,我的解决方案是清除容器入口点中的缓存,但我意识到在某些情况下这可能是一个相当繁重的操作,所以我在AppKernel中基于内核的引导函数创建了一个自定义编译函数:

/**
 * Recompiles the container without warming up the whole cache.
 *
 * Can be called upon docker container start to inject custom parameters.
 */
public function compile()
{
    // Load class cache
    if ($this->loadClassCache) {
        $this->doLoadClassCache($this->loadClassCache[0], $this->loadClassCache[1]);
    }
    // Initialize bundles to be able to parse configurations
    $this->initializeBundles();
    $class = $this->getContainerClass();
    $cache = new ConfigCache($this->getCacheDir().'/'.$class.'.php', $this->debug);
    $container = $this->buildContainer();
    $container->compile();
    $this->dumpContainer($cache, $container, $class, $this->getContainerBaseClass());
}

现在,在每次Docker容器启动时(在应用程序启动之前)都会调用此函数。

这是一个安全的操作吗?我应该假设任何缓存加温器都可能依赖于容器参数吗?(因为我只在运行时更改容器参数,所以服务和其他一切都应该保持不变)。

最初在一次symfony回购发行中问道:https://github.com/symfony/symfony/issues/19525

PR到我的自定义存储库:https://github.com/webplates/symfony-standard/pull/42

这通常无法回答,它完全取决于您使用的捆绑包和更改的参数。例如,如果您的路由依赖于一个参数(例如,在路由上设置主机),则仅重建容器还不够,则需要进行预热以重建路由。

最新更新