《交响乐5:快车道》的封面欧宝娱乐app下载地址

欧宝娱乐app下载地址交响乐5:快车道是学习现代Symfony发展的最佳书籍,从零到生产。欧宝娱乐app下载地址+300页展示与Docker,API,队列和欧宝娱乐app下载地址异步任务,网克,SPA等的Symfony。

Messenger组件

5.3版本
维护 没有维护的
欧宝娱乐app下载地址Symfony 5.3支持经过JoliCode

Messenger组件

Messenger组件可帮助应用程序发送和接收来自其他应用程序的消息或通过消息队列发送消息。

组件很大程度上受到了Matthias Noback系列的启发关于命令总线的博客文章单纯行程

也可以看看

本文解释了如何在任何PHP应用程序中将Messenger特性作为独立组件使用。读了Messenger:Sync和排队消息处理文章学习如何在Symfony应用程序中使用它。欧宝娱乐app下载地址

安装

1
$作曲家需要Symfony / Me欧宝娱乐app下载地址ssenger

笔记

如果在Symfony应用程序之外安装此组件,则必须要求欧宝娱乐app下载地址供应商/ autoload.php.以启用Composer提供的类自动加载机制。读这篇文章更多细节。

概念

发件人
负责序列化和发送消息的东西。例如,这个东西可以是消息代理或第三方API。
接收机
负责将消息检索,反序列化和转发到处理程序。例如,这可以是消息队列提取器或API端点。
处理程序
负责使用适用于消息的业务逻辑处理消息。类调用处理程序handlemessagemiddleware.中间件。
中间件
在通过总线分派消息时,中间件可以访问消息及其包装器(信封)。字面上的“中间的软件”,这些不是核心问题的核心问题(业务逻辑)。相反,它们是在整个应用程序中适用并影响整个消息总线的交叉切割问题。例如:日志记录,验证消息,启动事务,...它们也负责调用链中的下一个中间件,这意味着它们可以通过向其添加盖章或甚至更换它来调整信封,以及中断中间件链。当消息最初在从传输收到消息时稍后再次调度,中间件都被称为。
信封
信使特定的概念,它在消息总线内部提供了充分的灵活性,通过将消息包装到其中,允许在内部添加有用的信息信封上的邮票
信封上的邮票
需要附加到消息上的一条信息:用于传输的序列化器上下文、标识接收到的消息的标记或中间件或传输层可能使用的任何类型的元数据。

公共汽车

总线用于发送消息。总线的行为在它的有序中间件堆栈中。该组件附带了一组您可以使用的中间件。

使用Symfony FrameworkBundle使用邮件总线时欧宝娱乐app下载地址,为您配置了以下中间件:

  1. 欧宝娱乐app下载地址symfony \ component \ messenger \ middleware \ sendmessagemiddleware(启用异步处理,如果传递记录器,则记录消息的处理)
  2. 欧宝娱乐app下载地址Symfony \中间件组件\信使\ \ HandleMessageMiddleware(调用注册的处理程序)

例子:

使用app \ message \ myMessage;使用app \ messageHandler \ mymessageHandler;使用欧宝娱乐app下载地址symfony \ component \ messenger \ handler \ handlerslocator;使用欧宝娱乐app下载地址Symfony \ \信使\ MessageBus组件;使用欧宝娱乐app下载地址Symfony \中间件组件\信使\ \ HandleMessageMiddleware;美元的处理程序=MyMessageHandler.();美元的公共汽车=MessageBus([handlemessagemiddleware.处理程序疫包([MyMessage::班级= >[美元的处理程序),))),]);美元的公共汽车->派遣MyMessage/ *……* /));

笔记

每个中间件都需要实现欧宝娱乐app下载地址Symfony \中间件组件\信使\ \ MiddlewareInterface

处理程序

一旦发送到总线,消息将由“消息处理器”处理。消息处理程序是一个PHP可调用对象(例如,一个函数或一个类的实例),它将为你的消息做必要的处理:

名称空间应用MessageHandler \;使用app \ message \ myMessage;班级MyMessageHandler.{公共函数__invokeMyMessage美元的消息{//消息处理......}}

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

如果需要向消息中添加元数据或一些配置,则使用欧宝娱乐app下载地址Symfony \组件\信使\信封课程和添加邮票。例如,要设置消息通过传输层时使用的序列化组,请使用SerializerStamp邮票:

使用欧宝娱乐app下载地址Symfony \组件\信使\信封;使用欧宝娱乐app下载地址symfony \ component \ messenger \ stamp \ serializerstamp;美元的公共汽车->派遣信封美元的消息)))->SerializerStamp([//组应用于整个消息,所以请确保//为每个嵌入对象定义组“组织”= >['my_serialization_groups'),))));

以下是Symfony Messenger附送的一些重要信封邮票:欧宝娱乐app下载地址

  1. 欧宝娱乐app下载地址Symfony \组件\信使\ \ DelayStamp邮票,延迟异步消息的处理。
  2. 欧宝娱乐app下载地址symfony \ component \ messenger \ stamp \ dispatchaftercurrentbusstamp,使消息在当前总线执行后得到处理。阅读更多事务信息:处理完成后处理新消息
  3. 欧宝娱乐app下载地址symfony \ component \ messenger \ stamp \ handledstamp,一个标记由特定处理程序处理的消息的标记。允许访问处理程序返回的值和处理程序名称。
  4. 欧宝娱乐app下载地址Symfony \组件\信使\ \ ReceivedStamp邮票,一个内部标记,将消息标记为从传输端接收的消息。
  5. 欧宝娱乐app下载地址Symfony \组件\信使\ \ SentStamp邮票,标记消息是由特定发送方发送的。允许访问发送方FQCN和别名(如果可用)欧宝娱乐app下载地址Symfony \信使\交通\ \组件发送方\ SendersLocator
  6. 欧宝娱乐app下载地址symfony \ component \ messenger \ stamp \ serializerstamp,配置传输使用的序列化组。
  7. 欧宝娱乐app下载地址Symfony \组件\信使\ \ ValidationStamp邮票,以配置启用验证中间件时使用的验证组。

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

使用App \ Message \ Stamp \ Anothersamp;使用欧宝娱乐app下载地址Symfony \组件\信使\信封;使用欧宝娱乐app下载地址Symfony \中间件组件\信使\ \ MiddlewareInterface;使用欧宝娱乐app下载地址symfony \ component \ messenger \ middleware \ stackinterface;使用欧宝娱乐app下载地址Symfony \组件\信使\ \ ReceivedStamp邮票;班级myownmiddleware.实现了MiddlewareInterface{公共函数处理信封$信封StackInterface美元的堆栈信封{如果= = !$信封->去年ReceivedStamp::班级))){//刚刚收到的消息......//您可以例如添加另一张邮票。$信封=$信封->一张山/ *……* /));}别的{//消息最初被发送}返回美元的堆栈->下一个()->处理$信封美元的堆栈);}}

上面的示例将消息转发到下一个中​​间件,附加标记如果该消息刚刚被接收(即至少有一个ReceivedStamp邮票)。您可以通过实施创建自己的邮票欧宝娱乐app下载地址Symfony \组件\信使\ \ StampInterface邮票

如果要检查信封上的所有邮票,请使用$信封 - >所有()方法,返回按类型分组的所有邮票(FQCN)。或者,您可以通过使用FQCN作为该方法的第一参数来迭代特定类型的所有邮票(例如,信封- >所有(ReceivedStamp::类))。

笔记

任何戳记必须使用Symfony Serializer组件进行序列化,如果使用欧宝娱乐app下载地址欧宝娱乐app下载地址symfony \ component \ messenger \ transport \ serialization \ serializer基本序列化器。

传输

为了发送和接收消息,您必须配置传输。传输将负责与您的消息代理或第三方进行通信。

你自己的发件人

假设你已经有一个ImportantAction消息通过消息总线并由处理程序处理。现在,您还希望将此消息作为电子邮件发送(使用哑剧邮箱组件)。

使用欧宝娱乐app下载地址symfony \ component \ messenger \ transport \ sender \ senderinterface,您可以创建自己的邮件发件人:

名称空间App \ MessageSender;使用app \ message \ forigry;使用欧宝娱乐app下载地址Symfony \ \梅勒\ MailerInterface组件;使用欧宝娱乐app下载地址Symfony \组件\信使\信封;使用欧宝娱乐app下载地址symfony \ component \ messenger \ transport \ sender \ senderinterface;使用欧宝娱乐app下载地址Symfony \组件\ Mime \电子邮件;班级ImportantActionToEmailSender实现了SenderInterface{私人的梅勒美元;私人的$ toebail.;公共函数__构造MailerInterface梅勒美元字符串$ toebail.{这个美元->梅勒=梅勒美元;这个美元->发邮件=$ toebail.;}公共函数发送信封$信封信封{美元的消息=$信封->getMessage();如果!!美元的消息instanceof.ImportantAction{\ InvalidArgumentExceptionSprintf.此传输只支持"%s"消息。ImportantAction::班级));}这个美元->梅勒->发送电子邮件())->这个美元->发邮件->主题的重要作用->超文本标记语言'

由'制作的重要动作

美元的消息->getUsername()' < / p > ');返回$信封;}}

你自己的接收机

接收者负责从源获取消息并将其发送到应用程序。

假设您已经在应用程序中使用新命令消息。现在,您想要集成第三方或遗留应用程序,但您不能使用API,需要使用共享的CSV文件与新订单。

您将读取这个CSV文件并分派一个新命令消息。您需要做的就是编写自己的CSV接收者:

名称空间App \ MessageReceiver;使用应用\ \里NewOrder消息;使用欧宝娱乐app下载地址Symfony \组件\信使\信封;使用欧宝娱乐app下载地址Symfony \组件\信使\ \ MessageDecodingFailedException异常;使用欧宝娱乐app下载地址Symfony \组件\信使\运输\接收机\ ReceiverInterface;使用欧宝娱乐app下载地址symfony \ component \ serializer \ serializerInterface;班级NewOrdersFromCsvFileReceiver实现了ReceiverInterface{私人的$ Serializer.;私人的filePath美元;公共函数__构造SerializerInterface$ Serializer.字符串filePath美元{这个美元->序列化器=$ Serializer.;这个美元->filePath=filePath美元;}公共函数得到()可迭代的{//根据你的交通情况收到信封($ yourrenvelope here),//在大多数情况下,使用连接是最简单的解决方案。如果===.$ yaleenvelope.{返回[];}试一试{$信封=这个美元->序列化器->解码([“身体”= >$ yaleenvelope.[“身体”),“头”= >$ yaleenvelope.[“头”),]);}MessageDecodingFailedException美元的例外{这个美元->连接->拒绝$ yaleenvelope.['ID']);美元的例外;}返回[$信封->CustomStamp$ yaleenvelope.['ID'))));}公共函数ACK.信封$信封无效{//添加被处理消息的信息}公共函数拒绝信封$信封无效{//在自定义连接情况下这个美元->连接->拒绝这个美元->findcustomstamp.$信封->getId());}}

接收器和发件人在同一总线上

要允许在同一总线上发送和接收消息并防止无限循环,消息总线将添加一个欧宝娱乐app下载地址Symfony \组件\信使\ \ ReceivedStamp邮票邮票到消息信封和欧宝娱乐app下载地址symfony \ component \ messenger \ middleware \ sendmessagemiddleware中间件将知道它不应该再将这些消息再次路由到传输。

这项工作,包括代码样本,是在一个Creative Commons by-SA 3.0执照。