如何使用编译器传递

编辑本页

如何使用编译器传递

编译器传递给你一个操作其他的机会服务定义已经注册到服务容器的。你可以在组件部分阅读如何创建它们。编译容器".

类中注册编译器传递build ()应用程序内核的方法:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/ / src / Kernel.php名称空间应用程序使用应用程序DependencyInjection编译器CustomPass使用欧宝娱乐app下载地址FrameworkBundle内核MicroKernelTrait使用欧宝娱乐app下载地址组件DependencyInjectionContainerBuilder使用欧宝娱乐app下载地址组件HttpKernel内核作为BaseKernel内核扩展BaseKernel使用MicroKernelTrait/ /……受保护的函数构建(ContainerBuilder容器无效容器->addCompilerPass (CustomPass ());}}

编译器传递最常见的用例之一是处理标记服务.在这些情况下,您可以让内核实现,而不是创建编译器通道CompilerPassInterface的内部处理服务过程()方法:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/ / src / Kernel.php名称空间应用程序使用欧宝娱乐app下载地址FrameworkBundle内核MicroKernelTrait使用欧宝娱乐app下载地址组件DependencyInjection编译器CompilerPassInterface使用欧宝娱乐app下载地址组件DependencyInjectionContainerBuilder使用欧宝娱乐app下载地址组件HttpKernel内核作为BaseKernel内核扩展BaseKernel实现了CompilerPassInterface使用MicroKernelTrait/ /……公共函数过程(ContainerBuilder容器无效//在这个方法中,你可以操作服务容器://例如,更改一些容器服务:容器->getDefinition (“app.some_private_service”->setPublic (真正的);//或处理带标签的服务:foreach容器->findTaggedServiceIds (“some_tag”作为id= >标签){/ /……}}}

在包中使用编译器传递

可以定义编译器传递在build ()方法的初始化(在实现过程()扩展中的方法):

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src / MyBundle / MyBundle.php名称空间应用程序MyBundle使用应用程序DependencyInjection编译器CustomPass使用欧宝娱乐app下载地址组件DependencyInjectionContainerBuilder使用欧宝娱乐app下载地址组件HttpKernelMyBundle扩展公共函数构建(ContainerBuilder容器无效::构建(容器);容器->addCompilerPass (CustomPass ());}}

如果您使用自定义服务标签在一个bundle中,按照惯例,标记名由bundle的名称(小写,下划线作为分隔符),然后是一个点,最后是“真实”名称组成。例如,如果您想在AcmeMailerBundle中引入某种“传输”标记,您应该调用它acme_mailer.transport

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。
欧宝娱乐app下载地址Symfony 5.4支持通过私人Packagist