通讯组件

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 4.4,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

通讯组件

信使组件帮助应用程序发送和接收消息/从其他应用程序或通过消息队列。

组件是极大地受到马提亚Noback系列博客对命令的公交车SimpleBus项目

另请参阅

这篇文章解释了如何使用信使的功能作为一个独立的组件在任何PHP应用程序。读了信使:同步和排队消息处理文章在Symfony应用程序了解如何使用它。欧宝娱乐app下载地址

安装

1
美元作曲家需要symfony /信使欧宝娱乐app下载地址

请注意

如果你安装这个组件之外的Symfony应用程序,你必须要求欧宝娱乐app下载地址供应商/ autoload.php文件在你的代码,使作曲家提供的类加载机制。读这篇文章为更多的细节。

概念

发送方:
负责序列化和发送消息的东西。这东西可以是一个message broker或第三方API为例。
接收机:
负责检索,反序列化和转发消息处理程序(s)。这可能是一个消息队列拆卸器或一个API端点。
处理程序:
负责处理消息使用业务逻辑适用于消息。处理程序调用HandleMessageMiddleware中间件。
中间件:
中间件可以访问消息及其包装器(信封),而这是通过总线。字面上的“中间的软件”,那些都不是核心关切(业务逻辑)的应用程序。相反,它们是横切关注点在整个应用程序中适用,影响整个消息总线。例如:日志记录,验证消息,启动一个事务,……他们也负责调用链中的下一个中间件,这意味着他们可以调整信封,通过添加邮票甚至取代它,以及中间件链中断。中间件都称为原发货消息时再一次后,收到传输消息。
信封:
信使具体概念,它给完整的灵活性在消息总线,通过包装的信息,允许通过内部添加有用的信息信封上的邮票
信封上的邮票:
信息你需要附加信息:序列化器上下文用于运输、标记识别收到的消息或任何形式的元数据中间件或传输层可以使用。

公共汽车

公共汽车用于分派消息。总线的行为在其命令中间件堆栈。组件提供了一组可以使用的中间件。

当使用消息总线在Symfony的FrameworkBundle,欧宝娱乐app下载地址中间件为你配置如下:

  1. LoggingMiddleware(日志处理你的消息)
  2. SendMessageMiddleware(支持异步处理)
  3. HandleMessageMiddleware(调用注册处理程序(s))

4.3

LoggingMiddleware弃用,因为Symfony 4.3和5.0欧宝娱乐app下载地址将被删除。通过日志记录器SendMessageMiddleware代替。

例子:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
使用应用程序\消息\MyMessage;使用应用程序\MessageHandler\MyMessageHandler;使用欧宝娱乐app下载地址\组件\信使\处理程序\HandlersLocator;使用欧宝娱乐app下载地址\组件\信使\MessageBus;使用欧宝娱乐app下载地址\组件\信使\中间件\HandleMessageMiddleware;美元处理程序=MyMessageHandler ();美元公共汽车=MessageBus ([HandleMessageMiddleware (HandlersLocator ([MyMessage::类= > [美元处理程序]]))));美元公共汽车- >调度(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
使用欧宝娱乐app下载地址\组件\信使\信封;使用欧宝娱乐app下载地址\组件\信使\邮票\SerializerStamp;美元公共汽车- >调度((信封(美元消息))- >(SerializerStamp ([/ /组应用于整个消息,所以确保/ /定义组每一个嵌入的对象“组织”= > [“my_serialization_groups”)))));

这里有一些重要的信封邮票附带Symfony的信使:欧宝娱乐app下载地址

  1. DelayStamp,推迟处理异步消息。
  2. DispatchAfterCurrentBusStamp,使信息处理当前总线后执行。阅读更多事务性消息:处理后新消息处理完成
  3. HandledStamp邮票,标志着信息操作通过一个特定处理器。允许访问处理程序返回值和处理程序名称。
  4. ReceivedStamp,一个内部邮票,标志着收到传输信息。
  5. SentStamp邮票,标志着特定发件人发送的信息。允许访问如果可以从发送者FQCN和别名SendersLocator
  6. SerializerStamp、配置串行化组所使用的交通工具。
  7. ValidationStamp,配置验证组启用验证时使用的中间件。

而不是直接处理中间件的消息你收到信封。因此您可以检查信封内容及其邮票,或添加任何:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
使用应用程序\消息\邮票\AnotherStamp;使用欧宝娱乐app下载地址\组件\信使\信封;使用欧宝娱乐app下载地址\组件\信使\中间件\MiddlewareInterface;使用欧宝娱乐app下载地址\组件\信使\中间件\StackInterface;使用欧宝娱乐app下载地址\组件\信使\邮票\ReceivedStamp;MyOwnMiddleware实现了MiddlewareInterface{公共函数处理(信封美元信封,StackInterface美元堆栈):信封{如果(= = !美元信封- >最后(ReceivedStamp::类)){/ /消息就已经收到…/ /可以例如添加另一个邮票。美元信封=美元信封- >(AnotherStamp (/ *……* /));}其他的{/ /消息只是原发货}返回美元堆栈- >next ()- >处理(美元信封,美元堆栈);}}

上面的示例将消息转发到下一个中间件与额外的邮票如果消息刚刚收到(即至少有一个ReceivedStamp邮票)。您可以创建自己的邮票通过实现StampInterface

如果你想要检查所有的邮票在信封,使用$信封- >所有()按类型分组的方法,该方法返回所有邮票(FQCN)。或者,您可以遍历所有邮票特定类型的使用FQCN作为该方法的第一个参数(如$信封- >所有(ReceivedStamp::类))。

请注意

任何邮票使用Symfony的序列化器组件必须是可序列化的,如果通过传输使用欧宝娱乐app下载地址序列化器基本序列化器。

传输

为了发送和接收消息,你必须配置一个交通工具。运输将负责与你的message broker或第三方。

你自己的发送者

假设你已经有了一个ImportantAction消息通过消息总线和被处理程序处理。现在,你还想把这消息作为一个电子邮件(使用Mime梅勒组件)。

使用SenderInterface,你可以创建自己的消息发送者:

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 30 31 32 33 34 35 36 37
名称空间应用程序\MessageSender;使用应用程序\消息\ImportantAction;使用欧宝娱乐app下载地址\组件\梅勒\MailerInterface;使用欧宝娱乐app下载地址\组件\信使\信封;使用欧宝娱乐app下载地址\组件\信使\运输\发送方\SenderInterface;使用欧宝娱乐app下载地址\组件\Mime\电子邮件;ImportantActionToEmailSender实现了SenderInterface{私人美元梅勒;私人美元toEmail;公共函数__construct(MailerInterface美元梅勒、字符串美元toEmail){美元- >梅勒=美元梅勒;美元- >toEmail =美元toEmail;}公共函数发送(信封美元信封):信封{美元消息=美元信封- >getMessage ();如果(!美元消息运算符ImportantAction) {\ InvalidArgumentException (sprintf (“这运输只支持“% s”消息。,ImportantAction::类));}美元- >梅勒- >发送((电子邮件())- >(美元- >toEmail)- >主题(的重要作用)- >html (' < h1 > < / h1 > < p >重要行动由“美元消息- >getUsername ()。“< / p >”));返回美元信封;}}

你自己的接收机

接收器负责得到消息从源和调度应用程序。

想象你已经处理过的一些“订单”在您的应用程序使用里NewOrder消息。现在你想与第三方或集成遗留应用程序,但你不能用一个API和CSV文件需要使用一个共享的新订单。

你会读这个CSV文件和调度里NewOrder消息。所有您需要做的是编写自己的CSV接收机:

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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
名称空间应用程序\MessageReceiver;使用应用程序\消息\里NewOrder;使用欧宝娱乐app下载地址\组件\信使\信封;使用欧宝娱乐app下载地址\组件\信使\异常\MessageDecodingFailedException;使用欧宝娱乐app下载地址\组件\信使\运输\接收机\ReceiverInterface;使用欧宝娱乐app下载地址\组件\序列化器\SerializerInterface;NewOrdersFromCsvFileReceiver实现了ReceiverInterface{私人美元序列化器;私人美元filePath;公共函数__construct(SerializerInterface美元序列化器、字符串美元filePath){美元- >序列化器=美元序列化器;美元- >filePath =美元filePath;}公共函数得到():iterable{根据您的运输/ /收到信封(这里yourEnvelope美元),/ /在大多数情况下,使用一个连接是最简单的解决方案。如果(= = =