symfony 的容器是有一个编译过程的,框架初始化的时候会执行
Symfony\Component\HttpKernel\Kernel::initializationContainer
,这个方法会对代码进行检查,看是否需要生成新的容器代码。如果需要 Symfony 会将各个类的依赖关系通过编译生成静态的类并存储在缓存文件
var/cache/[ENV]/appProjectContainer
中。
其中很多是框架自己的依赖关系,这些依赖关系类似java的方式,通过xml文件的形式进行声明,这些xml存在与框架的代码中,
Syfmony\Bundle\FrameworkBundle\Resource\config\*.xml
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
# Symfony\Component\HttpKernel\Kernel protected function prepareContainer(ContainerBuilder $container) { $extensions = array(); // 这里的 bundles 是在 initializeBundles 方法中实例化AppKernel中注册的Bundles 进行的赋值 foreach ($this->bundles as $bundle) { // 这里将注册的Bundle进行循环处理 // 取出bundle的extension 并 注册到 container中 if ($extension = $bundle->getContainerExtension()) { $container->registerExtension($extension); $extensions[] = $extension->getAlias(); }
if ($this->debug) { $container->addObjectResource($bundle); } }
foreach ($this->bundles as $bundle) { // 触发bundle的build方法 $bundle->build($container); }
$this->build($container);
// 这里的代码是为了确定将 MergeExtensionConfigurationPass 这个Pass类添加到容器的Pass中 $container->getCompilerPassConfig()->setMergePass(new MergeExtensionConfigurationPass($extensions)); }
|