Contributed by
Iltar van der Berg
in #20107.

bundle system 打从第一天起就是Symfony framework的一部分。然而,一些开发者倾向于在自己的程序中不使用bundle,除了Symfony内置的和第三方的bundles。

在Symfony 3.3中,通过向 Kernel 类中添加一个全新的 build() 方法,我们决定对此进行简化。这个方法允许注册compiler passes,并能在构建进程中(building process)操作容器。这就是为何此方法很容易地避免了使用任何bundle,甚至默认的AppBundle的原因。

思考以下的初始局面,你要在AppBundle中开启一些compiler passes,然后定义一个bundle extension以便加载一些配置信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// src/AppBundle.php
class AppBundle extends Bundle
{
    public function build(ContainerBuilder $container)
    {
        $container->addCompilerPass(new SomeCompilerPass());
        $container->addCompilerPass(new AnotherCompilerPass());
        $container->addCompilerPass(new YetAnotherCompilerPass());
    }
}
 
// src/AppBundle/DependencyInjection/AppExtension.php
class AppExtension extends Extension
{
    public function load(array $config, ContainerBuilder $container)
    {
        $binary = ExecutableResolver::getPath($container->getParameter('kernel.root_dir').'/../');
        $snappyConfig = ['pdf' => ['binary' => realpath($binary)]];
 
        $container->prependExtensionConfig('knp_snappy', $snappyConfig);
    }
}

在Symfony 3.3中,你可以完全移除AppBundle,而在你的 AppKernel 类中,定义这个 build() 方法来代替之:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// app/AppKernel.php
class AppKernel extends Kernel
{
    protected function build(ContainerBuilder $container)
    {
        $binary = ExecutableResolver::getPath($container->getParameter('kernel.root_dir').'/../');
        $snappyConfig = ['pdf' => ['binary' => realpath($binary)]];
 
        $container->prependExtensionConfig('knp_snappy', $snappyConfig);
        $container->addCompilerPass(new SomeCompilerPass());
        $container->addCompilerPass(new AnotherCompilerPass());
        $container->addCompilerPass(new YetAnotherCompilerPass());
    }
}