多个公共汽车
编辑该页面警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 4.1,不再维护。
读这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.3(当前的稳定版本)。
多个公共汽车
常见的体系结构在构建应用程序是独立的命令从查询。命令的行动做一些和查询获取数据。这叫做CQRS(命令查询责任隔离)。看到马丁篇关于CQRS要学习更多的知识。这种架构可以用信使一起组件通过定义多个公共汽车。
一个命令总线从一个有点不同查询公共汽车。例如,命令公交车通常不提供任何结果和查询公交车很少是异步的。您可以配置这些公共汽车和他们的规则,利用中间件。
它还可能是一个好主意从反应通过引入一个单独行动事件总线。事件总线可以有零个或多个订阅者。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
框架:信使:#公共汽车就是注射时注射MessageBusInterfacedefault_bus:messenger.bus.commands公共汽车:messenger.bus.commands:中间件:- - - - - -验证- - - - - -doctrine_transactionmessenger.bus.queries:中间件:- - - - - -验证messenger.bus.events:中间件:- - - - - -allow_no_handler- - - - - -验证
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
< !- - - - - -- - - - - -config/packages/messenger.xml -->< /span>< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/symfony //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><框架:配置>< !- - - - - -- - - - - -的公共汽车that is going to be injected when injecting MessageBusInterface -->< /span><框架:信使default-bus=“messenger.bus.commands”><框架:总线的名字=“messenger.bus.commands”><框架:中间件id=“确认”/ ><框架:中间件id=“doctrine_transaction”/ ><框架:总线><框架:总线的名字=“messenger.bus.queries”><框架:中间件id=“确认”/ ><框架:总线><框架:总线的名字=“messenger.bus.events”><框架:中间件id=“确认”/ ><框架:中间件id=“allow_no_handler”/ ><框架:总线>< /框架:信使>< /框架:配置>< /容器>
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日
/ /配置/包/ messenger.php美元容器- >loadFromExtension (“框架”,(“信使号”= > [/ /公共汽车就是注射时注射MessageBusInterface“default_bus”= >“messenger.bus.commands”,“公共汽车”= > [“messenger.bus.commands”= > [“中间件”= > [“验证”,“doctrine_transaction”),),“messenger.bus.queries”= > [“中间件”= > [“验证”),),“messenger.bus.events”= > [“中间件”= > [“验证”,“allow_no_handler”,]]]]]);
这将生成messenger.bus.commands
,messenger.bus.queries
和messenger.bus.events
服务,您可以将您的服务。
类型提示和连接
连接是一个很好的特性,允许您以减少所需的配置创建服务容器。通过使用MessageBusInterface
作为参数typehint服务,默认配置总线将被注入(即messenger.bus.commands
在上面的例子中)。
在处理多个公共汽车时,你可以使用DependencyInjection
组件的绑定功能来澄清哪个总线将被注入基于参数的名称:
1 2 3 4 5 6 7 8 9
#配置/ services.yaml服务:_defaults:#……绑定:$ commandBus:“@messenger.bus.commands”$ queryBus:“@messenger.bus.queries”$ eventBus:“@messenger.bus.events”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
< !- - - - - -- - - - - -config/services.xml -->< /span>< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><违约><绑定关键=“commandBus美元”类型=“服务”id=“messenger.bus.commands”/ ><绑定关键=“queryBus美元”类型=“服务”id=“messenger.bus.queries”/ ><绑定关键=“eventBus美元”类型=“服务”id=“messenger.bus.events”/ >< /违约>< /服务>< /容器>
1 2 3 4 5
/ /配置/ services.php美元容器- >bind (“commandBus美元”,“messenger.bus.commands”);美元容器- >bind (“queryBus美元”,“messenger.bus.queries”);美元容器- >bind (“eventBus美元”,“messenger.bus.events”);
限制每辆车处理程序
默认情况下,每个处理程序将被用于处理消息所有你的巴士。防止调度消息错了公共汽车没有一个错误,您可以限制每个处理程序到一个特定的总线使用的信使。message_handler的标签:
1 2 3 4
#配置/ services.yaml服务:应用MessageHandler \ \ SomeCommandHandler:标签:[{名称:messenger.message_handler,总线:messenger.bus.commands})
1 2 3 4 5 6 7 8 9 10 11 12 13
< !- - - - - -- - - - - -config/services.xml -->< /span>< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><服务id=“应用程序MessageHandler \ \ SomeCommandHandler”><标签的名字=“messenger.message_handler”公共汽车=“messenger.bus.commands”/ >< /服务>< /服务>< /容器>
1 2 3 4 5
/ /配置/ services.php美元容器- >服务()- >集(MessageHandler应用\ \ SomeCommandHandler::类)- >标记(“messenger.message_handler”,(“公共汽车”= >“messenger.bus.commands”]);
这种方式,应用MessageHandler \ \ SomeCommandHandler
处理程序才会知道的messenger.bus.commands
公共汽车。
你也可以自动添加这个标签类遵循命名约定和注册的所有处理程序服务的名字与正确的标签:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#配置/ services.yaml#把这个‘应用’行后注册你所有的服务command_handlers:名称空间:应用MessageHandler \ \资源:' % kernel.project_dir MessageHandler % / src / / * CommandHandler.php”标签:- - - - - -{名称:messenger.message_handler,总线:messenger.bus.commands}query_handlers:名称空间:应用MessageHandler \ \资源:' % kernel.project_dir MessageHandler % / src / / * QueryHandler.php”标签:- - - - - -{名称:messenger.message_handler,总线:messenger.bus.queries}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
< !- - - - - -- - - - - -config/services.xml -->< /span>< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务>< !- - - - - -- - - - - -command handlers -->< /span><原型名称空间=“应用程序MessageHandler \ \”资源=“MessageHandler % kernel.project_dir % / src / / * CommandHandler.php”><标签的名字=“messenger.message_handler”公共汽车=“messenger.bus.commands”/ >< /服务>< !- - - - - -- - - - - -query handlers -->< /span><原型名称空间=“应用程序MessageHandler \ \”资源=“MessageHandler % kernel.project_dir % / src / / * QueryHandler.php”><标签的名字=“messenger.message_handler”公共汽车=“messenger.bus.queries”/ >< /服务>< /服务>< /容器>
1 2 3 4 5 6 7 8 9 10 11
/ /配置/ services.php/ /命令处理程序美元容器- >服务()- >负载(“MessageHandler应用\ \ \”,' % kernel.project_dir MessageHandler % / src / / * CommandHandler.php”)- >标记(“messenger.message_handler”,(“公共汽车”= >“messenger.bus.commands”]);/ /查询处理程序美元容器- >服务()- >负载(“MessageHandler应用\ \ \”,' % kernel.project_dir MessageHandler % / src / / * QueryHandler.php”)- >标记(“messenger.message_handler”,(“公共汽车”= >“messenger.bus.queries”]);
调试汽车
的调试:信使
每辆车&命令列出可用的消息处理程序。你也可以限制到一个特定的列表总线通过提供其名称作为参数。
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
美元bin /控制台调试:信使信使= = = = = = = = = messenger.bus.commands - - - - - - - - - - - - - - - - - - - - - - -以下消息可以派遣:- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - App \ MessageHandler消息\ DummyCommand由应用\ \ DummyCommandHandler MessageHandler应用\ \ MultipleBusesMessage消息由应用\ \ MultipleBusesMessageHandler - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - messenger.bus。查询- - - - - - - - - - - - - - - - - - - - - - - -以下消息可以派遣:- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - App \ MessageHandler消息\ DummyQuery由应用\ \ DummyQueryHandler MessageHandler应用\ \ MultipleBusesMessage消息由应用\ \ MultipleBusesMessageHandler - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -