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());
}
} |