> Symfony中文手册 > 如何在Bundles中对Compiler Passes进行操作

如何在Bundles中对Compiler Passes进行操作

Compiler passes了给你一个机会去操纵“已经在服务容器中注册过的”其他服务定义。你可以阅读组件部分的“在编译过程中执行代码” 来了解如何去创建它们。

当使用独立的Compiler Passes时,你需要在bundle类的build()方法中去注册他们(当在扩展中实现了process()方法时,此处就不需要了):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// src/AppBundle/AppBundle.PHP
namespace AppBundle;
 
use Symfony\Component\HttpKernel\Bundle\Bundle;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use AppBundle\DependencyInjection\Compiler\CustomPass;
 
class AppBundle extends Bundle
{
    public function build(ContainerBuilder $container)
    {
        parent::build($container);
 
        $container->addCompilerPass(new CustomPass());
    }
}

compiler passes一个最常见的用例是使用标打了签标的服务(参考 如何操作服务的标签”)。如果你在bundle中使用了自定义的标签,即可依照惯例,标签名称应该包含“bundle名”(小写字母,以下划线作为分隔),跟着的是一个英文逗点,最后是“真正”的tag名称。例如,如果你想在AcmeMailerBundle类中使用某个“transport”标签,你应该把它命名为acme_mailer.transport