信使组件
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 4.1,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
信使组件
Messenger组件帮助应用程序向其他应用程序或通过消息队列发送和接收消息。
该组件的灵感来自于Matthias Noback的系列关于命令总线的博客文章和SimpleBus项目.
另请参阅
本文解释了如何在任何PHP应用程序中将Messenger特性作为独立组件使用。读了如何使用信使文章,以了解如何在Symfony应用程序中使用它。ob娱乐下载
安装
1
$作曲家需要交响乐/信使ob娱乐下载
或者,您可以克隆https://github.com/ob娱乐下载symfony/messenger存储库。
请注意
如果在Symfony应用程序外部安装此组件,则必须要求ob娱乐下载供应商/ autoload.php
文件,以启用Composer提供的类自动加载机制。读这篇文章欲知详情。
概念
- 发送方:
- 负责序列化和发送消息到某物.例如,这个东西可以是消息代理或第三方API。
- 接收机:
- 负责检索、反序列化消息并将消息转发给处理程序。例如,这可以是消息队列拉取器或API端点。
- 处理程序:
-
负责使用适用于消息的业务逻辑处理消息。类调用处理程序
HandleMessageMiddleware
中间件。 - 中间件:
- 中间件可以在消息通过总线分派时访问消息及其包装器(信封)。字面上的“中间的软件”,这些都不是应用程序的核心关注点(业务逻辑)。相反,它们是适用于整个应用程序并影响整个消息总线的横切关注点。例如:记录日志、验证消息、启动事务……它们还负责调用链中的下一个中间件,这意味着它们可以通过向其添加项目甚至替换它来调整信封,以及中断中间件链。
- 信封
- 特定于Messenger的概念,它在消息总线内部提供了充分的灵活性,通过将消息包装到其中,允许在消息总线内部添加有用的信息信封的物品.
- 信封的物品
- 需要附加到消息的信息:用于传输的序列化器上下文、标识接收到的消息的标记或中间件或传输层可能使用的任何类型的元数据。
公共汽车
总线用于发送消息。总线的行为在其有序的中间件堆栈中。该组件附带了一组可以使用的中间件。
在Symfony的FrameworkBundle中使用消息总线时ob娱乐下载,为您配置了以下中间件:
- LoggingMiddleware(记录您的消息处理)
- SendMessageMiddleware(启用异步处理)
- HandleMessageMiddleware(调用已注册的处理程序)
例子:
12 3 4 5 6 7 8 9 10 11 12
使用应用程序\消息\MyMessage;使用ob娱乐下载\组件\信使\MessageBus;使用ob娱乐下载\组件\信使\处理程序\定位器\HandlerLocator;使用ob娱乐下载\组件\信使\中间件\HandleMessageMiddleware;$公共汽车=新MessageBus ([新HandleMessageMiddleware (新HandlerLocator ([MyMessage::类= >$处理程序,])),]);$公共汽车->调度(新MyMessage (/ *……* /));
请注意
每个中间件都需要实现MiddlewareInterface.
处理程序
一旦发送到总线,消息将由“消息处理程序”处理。消息处理程序是一个PHP可调用的(即一个函数或一个类的实例),它将为你的消息做所需的处理:
1 2 3 4 5 6 7 8 9 10 11
名称空间应用程序\MessageHandler;使用应用程序\消息\MyMessage;类MyMessageHandler{公共函数__invoke(MyMessage$消息){//消息处理…}}
向消息(信封)中添加元数据
类将元数据或某些配置添加到消息中信封类。例如,要设置消息通过传输层时使用的序列化组,请使用SerializerConfiguration
信封:
1 2 3 4 5 6 7 8
使用ob娱乐下载\组件\信使\信封;使用ob娱乐下载\组件\信使\运输\序列化\SerializerConfiguration;$公共汽车->调度((新信封($消息))->(新SerializerConfiguration ([“组织”= > [“my_serialization_groups”],]));
目前,Symfony Messengeob娱乐下载r有以下内置信封项目:
- SerializerConfiguration,以配置传输使用的序列化组。
- ValidationConfiguration,以配置启用验证中间件时使用的验证组。
- ReceivedMessage,一个内部项,将消息标记为从传输接收到的消息。
方法来接收信封,而不是直接在中间件中处理消息EnvelopeAwareInterface记号笔,像这样:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
使用ob娱乐下载\组件\信使\异步\运输\ReceivedMessage;使用ob娱乐下载\组件\信使\中间件\MiddlewareInterface;使用ob娱乐下载\组件\信使\EnvelopeAwareInterface;类MyOwnMiddleware实现了MiddlewareInterface,EnvelopeAwareInterface{公共函数处理($信封,可调用的$下一个){// $envelope这里是一个' envelope '对象,因为这个中间件//实现EnvelopeAwareInterface接口。如果(零= = !$信封->get (ReceivedMessage::类)){//消息刚刚收到…//例如,您可以添加另一个项目。$信封=$信封->(新AnotherEnvelopeItem (/ *……* /));}返回$下一个($信封);}}
上面的示例将把消息转发到下一个中间件,并附加一个信封项如果消息刚刚被接收(即有' ReceivedMessage '项)。您可以通过实现来创建自己的项EnvelopeAwareInterface.
请注意
类型的传输,任何信封项都必须是php序列化的序列化器基本序列化器。
传输
为了发送和接收消息,您必须配置传输。传输将负责与您的消息代理或第三方通信。
您自己的发件人
使用SenderInterface,您可以创建自己的邮件发件人。假设你已经有一个ImportantAction
消息通过消息总线并由处理程序处理。现在,您还想以电子邮件的形式发送此消息。
首先,创建你的发件人:
12 34 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 30 31 32 33 34 35
名称空间应用程序\MessageSender;使用应用程序\消息\ImportantAction;使用ob娱乐下载\组件\信使\运输\SenderInterface;使用ob娱乐下载\组件\信使\信封;类ImportantActionToEmailSender实现了SenderInterface{私人$梅勒;私人$toEmail;公共函数__construct(\ Swift_Mailer$梅勒、字符串$toEmail){$这->梅勒=$梅勒;$这->toEmail =$toEmail;}公共函数发送(信封$信封){$消息=$信封->getMessage ();如果(!$消息运算符ImportantAction) {扔新\ InvalidArgumentException (sprintf (“此传输仅支持“%s”消息。”, ImportantAction::类));}$这->梅勒->发送((新\ Swift_Message (“已采取重要行动”))->该太空站($这->toEmail)->setBody ('重要动作
由'
.$消息->getUsername()。' < / p > ',“text / html”));}}
你自己的接球手
接收方负责从源获取消息并将它们分派给应用程序。
假设您已经在应用程序中使用命令处理一些“订单”里NewOrder
消息。现在,您希望与第三方或遗留应用程序集成,但不能使用API,需要对新订单使用共享的CSV文件。
您将读取此CSV文件并分派一个里NewOrder
消息。您所需要做的就是编写定制的CSV接收器,Symfony将完成其余的工作。ob娱乐下载
首先,创建你的接收者:
12 34 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 30 31 32 33 34
名称空间应用程序\MessageReceiver;使用应用程序\消息\里NewOrder;使用ob娱乐下载\组件\信使\运输\ReceiverInterface;使用ob娱乐下载\组件\序列化器\SerializerInterface;使用ob娱乐下载\组件\信使\信封;类NewOrdersFromCsvFileReceiver实现了ReceiverInterface{私人$序列化器;私人$filePath;公共函数__construct(SerializerInterface$序列化器、字符串$filePath){$这->序列化器=$序列化器;$这->filePath =$filePath;}公共函数收到(可调用的$处理程序):无效{$ordersFromCsv=$这->序列化器->反序列化(file_get_contents ($这->filePath),“csv”);foreach($ordersFromCsv作为$orderFromCsv){$订单=新里NewOrder ($orderFromCsv[“id”),$orderFromCsv[“account_id”),$orderFromCsv[“数量”]);$处理程序(新信封($订单));}}公共函数停止():无效{/ /等待}}
接收方和发送方在同一总线上
为了允许在同一总线上发送和接收消息并防止无限循环,消息总线将添加一个ReceivedMessage信封项以邮件信封和SendMessageMiddleware中间件将知道它不应该再次将这些消息路由到传输。