Messenger组件

5.3版本
保持 不明意
ob娱乐下载symfony 5.3支持经过乔利德

Messenger组件

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

Matthias Noback系列的灵感来自于此关于命令总线的博客帖子单纯行程

也可以看看

本文介绍如何在任何PHP应用程序中使用Messenger功能作为独立组件。阅读Messenger:Sync和排队消息处理文章了解如何在Symfony应用程序中使用它。ob娱乐下载

安装

1
$作曲家需要Symfony / Meob娱乐下载ssenger

笔记

如果在Symfony应用程序之外安装此组件,则必须要求ob娱乐下载供应商/ autoload.php.代码中的文件以启用Composer提供的类自动加载机制。读本文更多细节。

概念

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

公共汽车

总线用于派遣消息。总线的行为位于其有序的中间件堆栈中。该组件附带一组可以使用的中间件。

使用Symfony FrameworkBundle使用邮件总线时ob娱乐下载,为您配置了以下中间件:

  1. ob娱乐下载symfony \ component \ messenger \ middleware \ sendmessagemiddleware(启用异步处理,如果传递记录器,请记录消息的处理)
  2. ob娱乐下载symfony \ component \ messenger \ middleware \ handlemessagemiddleware(调用注册处理程序)

例子:

app \ message \ myMessage;app \ messageHandler \ mymessageHandler;ob娱乐下载symfony \ component \ messenger \ handler \ handlerslocator;ob娱乐下载Symfony \ Component \ Messenger \ MessageBus;ob娱乐下载symfony \ component \ messenger \ middleware \ handlemessagemiddleware;$处理程序=新的MyMessageHandler.();$班车=新的MessageBus.([新的handlemessagemiddleware.新的处理程序疫包([mymessage.::班级=>[$处理程序],]),]);$班车- >派遣新的mymessage./ * ... * /));

笔记

每个中间件都需要实现ob娱乐下载symfony \ component \ messenger \ middleware \ middlewareInterface

处理者

一旦派遣到总线,消息将由“消息处理程序”处理。消息处理程序是PHP可调用(即类的函数或类实例),这将对您的消息进行所需的处理:

命名空间app \ messageHandler.;app \ message \ myMessage;班级MyMessageHandler.{上市功能__invoke.mymessage.$消息{//消息处理......}}

将元数据添加到消息(信封)

如果您需要向消息添加元数据或某些配置,请将其包装ob娱乐下载symfony \ component \ messenger \信封课程和添加邮票。例如,要设置消息通过传输层时使用的序列化组,请使用serializerstamp.邮票:

ob娱乐下载symfony \ component \ messenger \信封;ob娱乐下载symfony \ component \ messenger \ stamp \ serializerstamp;$班车- >派遣新的信封$消息)))- >新的serializerstamp.([//组应用于整个消息,因此请确保//为每个嵌入对象定义组'团体'=>['my_serialization_groups'],])));

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

  1. ob娱乐下载symfony \ component \ messenger \ stamp \ delaystamp,延迟处理异步消息。
  2. ob娱乐下载symfony \ component \ messenger \ stamp \ dispatchaftercurrentbusstamp,要使当前总线执行后处理消息。阅读更多事务信息:处理完成后处理新消息
  3. ob娱乐下载symfony \ component \ messenger \ stamp \ handledstamp,一个标记由特定处理程序处理的消息的标记。允许访问处理程序返回的值和处理程序名称。
  4. ob娱乐下载Symfony \ Component \ Messenger \ Stamp \ RecoveryStamp,一个标记从传输收到的消息的内部标记。
  5. ob娱乐下载symfony \ component \ messenger \ stamp \ sentstamp,一个标记特定发件人发送的消息的邮票。允许访问发件人FQCN和别名(如果可用)ob娱乐下载symfony \ component \ messenger \ transport \ sender \ senderslocator
  6. ob娱乐下载symfony \ component \ messenger \ stamp \ serializerstamp,配置传输使用的序列化组。
  7. ob娱乐下载symfony \ component \ messenger \ stamp \ validationstamp,配置启用验证中间件时使用的验证组。

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

App \ Message \ Stamp \ Anothersamp;ob娱乐下载symfony \ component \ messenger \信封;ob娱乐下载symfony \ component \ messenger \ middleware \ middlewareInterface;ob娱乐下载symfony \ component \ messenger \ middleware \ stackinterface;ob娱乐下载Symfony \ Component \ Messenger \ Stamp \ RecoveryStamp;班级myownmiddleware.实施midterwareInterface.{上市功能处理信封$信封堆栈接口$堆栈信封{如果空值!==$信封- >最后的接受了::班级))){//刚刚收到的消息......//您可以例如添加另一张邮票。$信封=$信封- >新的一张山/ * ... * /));}别的{//消息刚刚派出}返回$堆栈- >下一个()- >处理$信封$堆栈);}}

上面的示例将消息转发到下一个中​​间件,附加标记如果刚刚收到了该消息(即至少有一个接受了邮票)。您可以通过实施创建自己的邮票ob娱乐下载symfony \ component \ messenger \ stamp \ Stampinterface

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

笔记

如果通过使用运输,则必须使用Symfony Serializer组件进行序列化。ob娱乐下载ob娱乐下载symfony \ component \ messenger \ transport \ serialization \ serializer基础串行器。

运输

要发送和接收消息,您必须配置传输。运输将负责与您的留言经纪人或第三方进行沟通。

你自己的发件人

想象一下,你已经拥有了一个重点通过消息总线进行消息并由处理程序处理。现在,您还希望将此消息发送为电子邮件(使用哑剧邮箱组件)。

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

命名空间app \ messageender.;app \ message \ forigry;ob娱乐下载symfony \ component \ mailer \ mailerInterface;ob娱乐下载symfony \ component \ messenger \信封;ob娱乐下载symfony \ component \ messenger \ transport \ sender \ senderinterface;ob娱乐下载symfony \ component \ mime \电子邮件;班级重要的是实施senderInterface.{私人的$邮箱;私人的$ toebail.;上市功能__构造mailerInterface.$邮箱细绳$ toebail.{$这一点- >邮箱=$邮箱;$这一点- >发邮件=$ toebail.;}上市功能发送信封$信封信封{$消息=$信封- >GetMessage.();如果!!$消息instanceof.重点{新的\ InvalidArgumentException.Sprintf.“此运输仅支持”%S“消息。重点::班级));}$这一点- >邮箱- >发送新的电子邮件())- >$这一点- >发邮件- >主题“重要行动”- >HTML.'

由'制作的重要动作

$消息- >getusername.()'');返回$信封;}}

你自己的接收者

接收器负责获取来自源的消息并将其分派给应用程序。

想象一下,您已经使用了应用程序中的一些“订单”新命令信息。现在您希望与第三方或遗留应用程序集成,但您无法使用API​​,并且需要使用新订单的共享CSV文件。

您将阅读此CSV文件并调度新命令信息。您需要做的就是编写自己的CSV接收者:

命名空间app \ messagereceiver.;app \ message \ neworder;ob娱乐下载symfony \ component \ messenger \信封;ob娱乐下载symfony \ component \ messenger \异常\ MessageCodingFailEdException;ob娱乐下载Symfony \ Component \ Messenger \ Transport \ Receiver \ ReceptionInterface;ob娱乐下载symfony \ component \ serializer \ serializerInterface;班级empordersfromcsvfilereceiver实施接收接口{私人的$ Serializer.;私人的$ filepath.;上市功能__构造SerializerInterface.$ Serializer.细绳$ filepath.{$这一点- >序列化器=$ Serializer.;$这一点- >文件路径=$ filepath.;}上市功能得到()迭代{//根据您的运输接收信封(这里$ YourenVelope),//在大多数情况下,使用连接是最简单的解决方案。如果空值===.$ yaleenvelope.{返回[];}尝试{$信封=$这一点- >序列化器- >解码(['身体'=>$ yaleenvelope.['身体'],“标题”=>$ yaleenvelope.[“标题”],]);}抓住MessageCodingFailedException.$例外{$这一点- >联系- >拒绝$ yaleenvelope.['ID']);$例外;}返回[$信封- >新的Customstamp.$ yaleenvelope.['ID']))];}上市功能ACK.信封$信封空白{//添加有关处理邮件的信息}上市功能拒绝信封$信封空白{//在自定义连接的情况下$这一点- >联系- >拒绝$这一点- >findcustomstamp.$信封- >getid.());}}

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

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

这项工作包括代码样本,是在a下获得的许可Creative Commons by-SA 3.0执照。