信使组件
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 5.2,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
信使组件
Messenger组件帮助应用程序向其他应用程序或通过消息队列发送和接收消息。
该组件的灵感来自于Matthias Noback的系列关于命令总线的博客文章和SimpleBus项目.
另请参阅
本文解释了如何在任何PHP应用程序中将Messenger特性作为独立组件使用。读了信使:同步和排队消息处理文章,以了解如何在Symfony应用程序中使用它。ob娱乐下载
安装
1
$作曲家需要交响乐/信使ob娱乐下载
请注意
如果在Symfony应用程序外部安装此组件,则必须要求ob娱乐下载供应商/ autoload.php
文件,以启用Composer提供的类自动加载机制。读这篇文章欲知详情。
概念
- 发送方:
- 负责序列化和发送消息到某物.例如,这个东西可以是消息代理或第三方API。
- 接收机:
- 负责检索、反序列化消息并将消息转发给处理程序。例如,这可以是消息队列拉取器或API端点。
- 处理程序:
-
负责使用适用于消息的业务逻辑处理消息。类调用处理程序
HandleMessageMiddleware
中间件。 - 中间件:
- 中间件可以在消息通过总线分派时访问消息及其包装器(信封)。字面上的“中间的软件”,这些都不是应用程序的核心关注点(业务逻辑)。相反,它们是适用于整个应用程序并影响整个消息总线的横切关注点。例如:记录日志、验证消息、启动事务……它们还负责调用链中的下一个中间件,这意味着它们可以调整信封,向其添加戳戳,甚至替换它,以及中断中间件链。中间件在最初发送消息时被调用,稍后从传输接收消息时再次被调用。
- 信封:
- 特定于Messenger的概念,它在消息总线内部提供了充分的灵活性,通过将消息包装到其中,允许在消息总线内部添加有用的信息信封上的邮票.
- 信封上的邮票:
- 需要附加到消息的信息:用于传输的序列化器上下文、标识接收到的消息的标记或中间件或传输层可能使用的任何类型的元数据。
公共汽车
总线用于发送消息。总线的行为在其有序的中间件堆栈中。该组件附带了一组可以使用的中间件。
在Symfony的FrameworkBundle中使用消息总线时ob娱乐下载,为您配置了以下中间件:
- SendMessageMiddleware(启用异步处理,如果您传递一个日志记录器,则记录您的消息的处理)
- HandleMessageMiddleware(调用已注册的处理程序)
例子:
12 3 4 5 6 7 8 9 10 11 12 13 14 15
使用应用程序\消息\MyMessage;使用应用程序\MessageHandler\MyMessageHandler;使用ob娱乐下载\组件\信使\处理程序\HandlersLocator;使用ob娱乐下载\组件\信使\MessageBus;使用ob娱乐下载\组件\信使\中间件\HandleMessageMiddleware;$处理程序=新MyMessageHandler ();$公共汽车=新MessageBus ([新HandleMessageMiddleware (新HandlersLocator ([MyMessage::Class => [$处理程序],])),]);$公共汽车->调度(新MyMessage (/ *……* /));
请注意
每个中间件都需要实现MiddlewareInterface.
处理程序
一旦发送到总线,消息将由“消息处理程序”处理。消息处理程序是一个PHP可调用的(即一个函数或一个类的实例),它将为你的消息做所需的处理:
1 2 3 4 5 6 7 8 9 10 11
名称空间应用程序\MessageHandler;使用应用程序\消息\MyMessage;类MyMessageHandler{公共函数__invoke(MyMessage$消息){//消息处理…}}
向消息(信封)中添加元数据
类将元数据或某些配置添加到消息中信封类并添加邮票。例如,要设置消息通过传输层时使用的序列化组,请使用SerializerStamp
邮票:
1 2 3 4 5 6 7 8 9 10
使用ob娱乐下载\组件\信使\信封;使用ob娱乐下载\组件\信使\邮票\SerializerStamp;$公共汽车->调度((新信封($消息))->(新SerializerStamp ([//组应用于整个消息,因此确保//为每个嵌入对象定义组“组织”= > [“my_serialization_groups”],]));
以下是Symfony Messenger附带的一些重要信封邮票:ob娱乐下载
- DelayStamp,以延迟异步消息的处理。
- DispatchAfterCurrentBusStamp,以使消息在当前总线执行之后被处理。欲知详情,请浏览事务性消息:在处理完成后处理新消息.
- HandledStamp,标记消息已由特定处理程序处理的戳记。允许访问处理程序返回值和处理程序名称。
- ReceivedStamp,一个内部戳,标记从传输接收到的消息。
- SentStamp,这是一个标记,标志着消息是由特定的发件人发送的。对象中可用时,允许访问发件人FQCN和别名SendersLocator.
- SerializerStamp,以配置传输使用的序列化组。
- ValidationStamp,以配置启用验证中间件时使用的验证组。
您收到的不是直接处理中间件中的消息,而是信封。因此,您可以检查信封内容及其邮票,或添加任何:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
使用应用程序\消息\邮票\AnotherStamp;使用ob娱乐下载\组件\信使\信封;使用ob娱乐下载\组件\信使\中间件\MiddlewareInterface;使用ob娱乐下载\组件\信使\中间件\StackInterface;使用ob娱乐下载\组件\信使\邮票\ReceivedStamp;类MyOwnMiddleware实现了MiddlewareInterface{公共函数处理(信封$信封, StackInterface$堆栈):信封{如果(零= = !$信封->最后(ReceivedStamp::类)){//消息刚刚收到…//例如,您可以添加另一个戳记。$信封=$信封->(新AnotherStamp (/ *……* /));}其他的{//消息刚被发送}返回$堆栈->next ()->处理($信封,$堆栈);}}
上面的示例将使用附加戳记将消息转发到下一个中间件如果消息刚刚被接收到(即至少有一个)ReceivedStamp
邮票)。您可以通过实现来创建自己的戳记StampInterface.
如果你想检查信封上的所有邮票,请使用$信封——> ()
方法,该方法返回按类型分组的所有戳记(FQCN)。或者,您可以通过使用FQCN作为该方法的第一个参数来遍历特定类型的所有戳记(例如。信封- >所有(ReceivedStamp::类)
).
请注意
类进行传输时,任何戳都必须使用Symfony Serializer组件进行序列化ob娱乐下载序列化器基本序列化器。
传输
为了发送和接收消息,您必须配置传输。传输将负责与您的消息代理或第三方通信。
您自己的发件人
假设你已经有一个ImportantAction
消息通过消息总线并由处理程序处理。现在,您还希望将此消息作为电子邮件发送(使用Mime而且梅勒组件)。
使用SenderInterface,你可以创建你自己的邮件发送者:
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 36 37
名称空间应用程序\MessageSender;使用应用程序\消息\ImportantAction;使用ob娱乐下载\组件\梅勒\MailerInterface;使用ob娱乐下载\组件\信使\信封;使用ob娱乐下载\组件\信使\运输\发送方\SenderInterface;使用ob娱乐下载\组件\Mime\电子邮件;类ImportantActionToEmailSender实现了SenderInterface{私人$梅勒;私人$toEmail;公共函数__construct(MailerInterface$梅勒、字符串$toEmail){$这->梅勒=$梅勒;$这->toEmail =$toEmail;}公共函数发送(信封$信封):信封{$消息=$信封->getMessage ();如果(!$消息运算符ImportantAction) {扔新\ InvalidArgumentException (sprintf (“此传输仅支持“%s”消息。”, ImportantAction::类));}$这->梅勒->发送((新电子邮件())->($这->toEmail)->主题(“已采取重要行动”)->html ('重要动作
由'
.$消息->getUsername()。' < / p > '));返回$信封;}}
你自己的接球手
接收方负责从源获取消息并将它们分派给应用程序。
假设您已经在应用程序中使用命令处理一些“订单”里NewOrder
消息。现在,您希望与第三方或遗留应用程序集成,但不能使用API,需要对新订单使用共享的CSV文件。
您将读取此CSV文件并分派一个里NewOrder
消息。您所需要做的就是编写自己的CSV接收器:
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
名称空间应用程序\MessageReceiver;使用应用程序\消息\里NewOrder;使用ob娱乐下载\组件\信使\信封;使用ob娱乐下载\组件\信使\异常\MessageDecodingFailedException;使用ob娱乐下载\组件\信使\运输\接收机\ReceiverInterface;使用ob娱乐下载\组件\序列化器\SerializerInterface;类NewOrdersFromCsvFileReceiver实现了ReceiverInterface{私人$序列化器;私人$filePath;公共函数__construct(SerializerInterface$序列化器、字符串$filePath){$这->序列化器=$序列化器;$这->filePath =$filePath;}公共函数得到():可迭代的{//根据您的交通工具收到信封(这里是$yourEnvelope),//在大多数情况下,使用连接是最简单的解决方案。如果(零= = =$yourEnvelope) {返回[];}试一试{$信封=$这->序列化器->解码([“身体”= >$yourEnvelope[“身体”),“头”= >$yourEnvelope[“头”)));}抓(MessageDecodingFailedException$异常) {$这->连接->拒绝($yourEnvelope[“id”]);扔$异常;}返回[$信封->(新CustomStamp ($yourEnvelope[“id”))));}公共函数消(信封$信封):无效{//添加处理消息的信息}公共函数拒绝(信封$信封):无效{//如果是自定义连接$这->连接->拒绝($这->findCustomStamp ($信封)->getId ());}}
接收方和发送方在同一总线上
为了允许在同一总线上发送和接收消息并防止无限循环,消息总线将添加一个ReceivedStamp把邮票贴在信封上SendMessageMiddleware中间件将知道它不应该再次将这些消息路由到传输。