使用标记服务
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.0,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
使用标记服务
标签是一个通用的字符串(以及一些选项),可以应用于任何服务。标签本身并不以任何方式改变您的服务的功能。但是如果你选择,你可以问一个容器建造者的所有服务的列表和一些特定的标签标记。这是有用的在编译器,您可以找到这些服务和在一些特定的方式使用或修改它们。
例如,如果您使用的是斯威夫特梅勒你想象你想实现一个“传递链”,这是一个集合类实现\ Swift_Transport
。用链式,你要迅速梅勒尝试多种方式运输到一个成功的消息。
首先,定义TransportChain
类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
类TransportChain{私人美元传输;公共函数__construct(){美元这- >传输=数组();}公共函数addTransport(\ Swift_Transport美元运输){美元这- >传输[]=美元运输;}}
然后,定义链作为一个服务:
- YAML
- XML
- PHP
1 2 3 4 5 6
参数:acme_mailer.transport_chain.class:TransportChain服务:acme_mailer.transport_chain:类:“% acme_mailer.transport_chain.class %”
1 2 3 4 5 6 7
<参数><参数关键=“acme_mailer.transport_chain.class”>TransportChain< /参数>< /参数><服务><服务id=“acme_mailer.transport_chain”类=“% acme_mailer.transport_chain.class %”/ >< /服务>
1 2 3 4 5
使用ob娱乐下载\组件\DependencyInjection\定义;美元容器- >setParameter (“acme_mailer.transport_chain.class”,“TransportChain”);美元容器- >setDefinition (“acme_mailer.transport_chain”,新定义(“% acme_mailer.transport_chain.class %”));
定义服务的定制标记
现在你可能会想要一些的\ Swift_Transport
类实例化并使用自动添加到链addTransport ()
方法。例如你可以添加以下运输服务:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10 11
服务:acme_mailer.transport.smtp:类:\ Swift_SmtpTransport参数:- - - - - -“% mailer_host %”标签:- - - - - -{名称:acme_mailer.transport}acme_mailer.transport.sendmail:类:\ Swift_SendmailTransport标签:- - - - - -{名称:acme_mailer.transport}
1 2 3 4 5 6 7 8
<服务id=“acme_mailer.transport.smtp”类=“\ Swift_SmtpTransport”><论点>% mailer_host %< /论点><标签的名字=“acme_mailer.transport”/ >< /服务><服务id=“acme_mailer.transport.sendmail”类=“\ Swift_SendmailTransport”><标签的名字=“acme_mailer.transport”/ >< /服务>
1 2 3 4 5 6 7 8 9
使用ob娱乐下载\组件\DependencyInjection\定义;美元definitionSmtp=新定义(“\ Swift_SmtpTransport”,数组(“% mailer_host %”));美元definitionSmtp- >addTag (“acme_mailer.transport”);美元容器- >setDefinition (“acme_mailer.transport.smtp”,美元definitionSmtp);美元definitionSendmail=新定义(“\ Swift_SendmailTransport”);美元definitionSendmail- >addTag (“acme_mailer.transport”);美元容器- >setDefinition (“acme_mailer.transport.sendmail”,美元definitionSendmail);
注意,每个有一个标签命名acme_mailer.transport
。这是自定义标签,您将使用在你的编译器通过。编译器通过使这个标记“的意思是”什么。
创建一个CompilerPass
你的编译器通过现在可以问任何服务定制标记的容器:
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
使用ob娱乐下载\组件\DependencyInjection\ContainerBuilder;使用ob娱乐下载\组件\DependencyInjection\编译器\CompilerPassInterface;使用ob娱乐下载\组件\DependencyInjection\参考;类TransportCompilerPass实现了CompilerPassInterface{公共函数过程(ContainerBuilder美元容器){如果(!美元容器- >hasDefinition (“acme_mailer.transport_chain”)){返回;}美元定义=美元容器- >getDefinition (“acme_mailer.transport_chain”);美元taggedServices=美元容器- >findTaggedServiceIds (“acme_mailer.transport”);foreach(美元taggedServices作为美元id= >美元属性){美元定义- >addMethodCall (“addTransport”,数组(新引用(美元id)));}}}
的过程()
方法检查的存在acme_mailer.transport_chain
服务,然后寻找所有服务标记acme_mailer.transport
。它增加了的定义acme_mailer.transport_chain
服务调用addTransport ()
为每个“acme_mailer。运输" service it has found. The first argument of each of these calls will be the mailer transport service itself.< /p>
注册通过的容器
你还需要注册通过的容器,它将运行时容器编译:
1 2 3 4
使用ob娱乐下载\组件\DependencyInjection\ContainerBuilder;美元容器=新ContainerBuilder ();美元容器- >addCompilerPass (新TransportCompilerPass);
请注意
不同的编译器通过注册如果您使用的是完整的堆栈框架。看到如何使用编译器通过包为更多的细节。
添加额外的属性标签
有时你需要额外信息的每个服务标记你的标签。例如,您可能想添加别名TransportChain。
首先,改变TransportChain
类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24
类TransportChain{私人美元传输;公共函数__construct(){美元这- >传输=数组();}公共函数addTransport(\ Swift_Transport美元运输,美元别名){美元这- >传输(美元别名]=美元运输;}公共函数getTransport(美元别名){如果(array_key_exists (美元别名,美元这- >传输)){返回美元这- >传输(美元别名];}其他的{返回;}}}
正如您可以看到的,什么时候addTransport
被调用时,不仅需要一个吗Swift_Transport
对象,也是一个字符串别名运输。所以,你怎么能让每个标记运输服务也提供一个别名吗?
要回答这个问题,改变服务宣言:
- YAML
- XML
1 2 3 4 5 6 7 8 9 10 11
服务:acme_mailer.transport.smtp:类:\ Swift_SmtpTransport参数:- - - - - -“% mailer_host %”标签:- - - - - -{名称:acme_mailer.transport,别名:喷火}acme_mailer.transport.sendmail:类:\ Swift_SendmailTransport标签:- - - - - -{名称:acme_mailer.transport,别名:酒吧}
1 2 3 4 5 6 7 8
<服务id=“acme_mailer.transport.smtp”类=“\ Swift_SmtpTransport”><论点>% mailer_host %< /论点><标签的名字=“acme_mailer.transport”别名=“foo”/ >< /服务><服务id=“acme_mailer.transport.sendmail”类=“\ Swift_SendmailTransport”><标签的名字=“acme_mailer.transport”别名=“酒吧”/ >< /服务>
注意到你已经添加了一个通用的别名
标签的关键。使用这个,更新编译器:
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 29
使用ob娱乐下载\组件\DependencyInjection\ContainerBuilder;使用ob娱乐下载\组件\DependencyInjection\编译器\CompilerPassInterface;使用ob娱乐下载\组件\DependencyInjection\参考;类TransportCompilerPass实现了CompilerPassInterface{公共函数过程(ContainerBuilder美元容器){如果(!美元容器- >hasDefinition (“acme_mailer.transport_chain”)){返回;}美元定义=美元容器- >getDefinition (“acme_mailer.transport_chain”);美元taggedServices=美元容器- >findTaggedServiceIds (“acme_mailer.transport”);foreach(美元taggedServices作为美元id= >美元tagAttributes){foreach(美元tagAttributes作为美元属性){美元定义- >addMethodCall (“addTransport”,数组(新引用(美元id),美元属性(“别名”)));}}}}
最棘手的部分是美元的属性
变量。因为你可以多次使用相同的标签上相同的服务(例如,理论上你可以标记相同的服务5次acme_mailer.transport
标签),美元的属性
是一个数组的每个标记的标签信息服务。