【发布时间】:2018-09-12 00:05:20
【问题描述】:
我使用 symfony 3.2。我想重写app/AppKernel#getContainerBaseClass。实际上我想重写Container 并创建我自己的,它从Symfony\Component\DependencyInjection\Container 扩展而来。
我发现AppKernel 有#getContainerBaseClass,据我所知返回容器类。我尝试了以下方法:
protected function getContainerBaseClass() {
if ('test' == $this->environment) {
return \AppBundle\DependencyInjection\TestContainer::class;
}
return parent::getContainerBaseClass();
}
而且它不起作用。我怎么知道它不起作用。首先,我检查容器是否不会从自定义容器中运行。其次,我在提到的方法中设置了断点,它没有被调用。但是调用了AppKernel#getRootDir 和AppKernel#getCacheDir 中的断点。我在Kernel 中搜索了一些有用的东西。但很难理解为什么它不起作用。我试图清除缓存。
在我看来,我做错了什么。但是互联网对重写 symfony 容器一无所知。很奇怪。
我想重写容器以允许更改(模拟)配置。目前据我所知 symfony 有一个无法更改的参数包。
【问题讨论】:
-
出于好奇:需要重写容器吗?
-
@ccKep 更新 Q
-
相关方法应该是基类
Kernel中的getContainerClass(不仅仅是getContainerBaseClass)和initializeContainer。 Lines 452 - 501 in Kernel.php供参考。 -
一般不明白为什么它们是相关的。
getContainerClass是在缓存中工作的类。考虑$class = $this->getContainerClass(); $cache = new ConfigCache($this->getCacheDir().'/'.$class.'.php', $this->debug);。在initializeContainer我基本上只能装饰容器,但也有限。 -
内核在
boot()中调用initializeContainer(),而后者又从getContainerClass()而不是getContainerBaseClass()中获取容器类名称。之后是$this->container = new $class();
标签: symfony