我正在尝试创建一个码头化的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
这通常无法回答,它完全取决于您使用的捆绑包和更改的参数。例如,如果您的路由依赖于一个参数(例如,在路由上设置主机),则仅重建容器还不够,则需要进行预热以重建路由。