信使组件

编辑本页

警告:您正在浏览的文档欧宝官网下载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娱乐下载,为您配置了以下中间件:

  1. SendMessageMiddleware(启用异步处理,如果您传递一个日志记录器,则记录您的消息的处理)
  2. HandleMessageMiddleware(调用已注册的处理程序)

例子:

12 3 4 5 6 7 8 9 10 11 12 13 14 15
使用应用程序消息MyMessage使用应用程序MessageHandlerMyMessageHandler使用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使用应用程序消息MyMessageMyMessageHandler公共函数__invoke(MyMessage消息//消息处理…}}

向消息(信封)中添加元数据

类将元数据或某些配置添加到消息中信封类并添加邮票。例如,要设置消息通过传输层时使用的序列化组,请使用SerializerStamp邮票:

1 2 3 4 5 6 7 8 9 10
使用ob娱乐下载组件信使信封使用ob娱乐下载组件信使邮票SerializerStamp公共汽车->调度((信封(消息))->(SerializerStamp ([//组应用于整个消息,因此确保//为每个嵌入对象定义组“组织”= > [“my_serialization_groups”],]));

以下是Symfony Messenger附带的一些重要信封邮票:ob娱乐下载

  1. DelayStamp,以延迟异步消息的处理。
  2. DispatchAfterCurrentBusStamp,以使消息在当前总线执行之后被处理。欲知详情,请浏览事务性消息:在处理完成后处理新消息
  3. HandledStamp,标记消息已由特定处理程序处理的戳记。允许访问处理程序返回值和处理程序名称。
  4. ReceivedStamp,一个内部戳,标记从传输接收到的消息。
  5. SentStamp,这是一个标记,标志着消息是由特定的发件人发送的。对象中可用时,允许访问发件人FQCN和别名SendersLocator
  6. SerializerStamp,以配置传输使用的序列化组。
  7. 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娱乐下载组件信使邮票ReceivedStampMyOwnMiddleware实现了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娱乐下载组件序列化器SerializerInterfaceNewOrdersFromCsvFileReceiver实现了ReceiverInterface私人序列化器私人filePath公共函数__construct(SerializerInterface序列化器、字符串filePath->序列化器=序列化器->filePath =filePath;}公共函数得到()可迭代的//根据您的交通工具收到信封(这里是$yourEnvelope),//在大多数情况下,使用连接是最简单的解决方案。如果= = =yourEnvelope) {返回[];}试一试信封->序列化器->解码([“身体”= >yourEnvelope“身体”),“头”= >yourEnvelope“头”)));}(MessageDecodingFailedException异常) {->连接->拒绝(yourEnvelope“id”]);异常;}返回信封->(CustomStamp (yourEnvelope“id”))));}公共函数(信封信封无效//添加处理消息的信息公共函数拒绝(信封信封无效//如果是自定义连接->连接->拒绝(->findCustomStamp (信封->getId ());}}

接收方和发送方在同一总线上

为了允许在同一总线上发送和接收消息并防止无限循环,消息总线将添加一个ReceivedStamp把邮票贴在信封上SendMessageMiddleware中间件将知道它不应该再次将这些消息路由到传输。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。