如何创建自己的信使运输

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 4.3,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

如何创建自己的信使运输

一旦编写了传输的发送方和接收方,就可以注册传输工厂,以便能够通过Symfony应用程序中的DSN使用它。欧宝娱乐app下载地址

创建您的运输工厂

您需要给FrameworkBundle从DSN创建传输的机会。你将需要一个运输工厂:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
使用欧宝娱乐app下载地址组件信使运输接收机ReceiverInterface使用欧宝娱乐app下载地址组件信使运输发送方SenderInterface使用欧宝娱乐app下载地址组件信使运输序列化SerializerInterface使用欧宝娱乐app下载地址组件信使运输TransportFactoryInterface使用欧宝娱乐app下载地址组件信使运输TransportInterfaceYourTransportFactory实现了TransportFactoryInterface公共函数createTransport(字符串dsn数组,选项, SerializerInterface序列化器TransportInterface返回YourTransport (/ *……* /);}公共函数支持(字符串dsn数组,选项保龄球返回0= = =(大小写敏感dsn“my-transport: / /”);}}

传输对象需要实现TransportInterface(结合SenderInterface而且ReceiverInterface).下面是一个简单的数据库传输示例:

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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
使用拉姆齐UuidUuid使用欧宝娱乐app下载地址组件信使信封使用欧宝娱乐app下载地址组件信使邮票TransportMessageIdStamp使用欧宝娱乐app下载地址组件信使运输序列化PhpSerializer使用欧宝娱乐app下载地址组件信使运输序列化SerializerInterface使用欧宝娱乐app下载地址组件信使运输TransportInterfaceYourTransport实现了TransportInterface私人db私人序列化器/ * * *@paramFakeDatabase $db用于演示目的。它不是一个真正的类。* /公共函数__construct(FakeDatabasedb, SerializerInterface序列化器= null)->db =db->序列化器=序列化器??PhpSerializer ();}公共函数得到()可迭代的//从"my_queue"获取消息->db->createQuery ('SELECT * FROM my_queue WHERE (delivered_at为NULL或delivered_at <:redeliver_timeout) AND handled = FALSE'->setParameter (“redeliver_timeout”DateTimeImmutable (“5分钟”))->getOneOrNullResult ();如果= = =){返回[];}信封->序列化器->解码([“身体”= >“信封”)));返回信封->(TransportMessageIdStamp (“id”))));}公共函数(信封信封无效邮票信封->最后(TransportMessageIdStamp::类);如果(!邮票运算符TransportMessageIdStamp) {\ LogicException (“在信封上没有发现TransportMessageIdStamp。”);}//将消息标记为"已处理"->db->createQuery ('UPDATE my_queue SET handled = TRUE WHERE id =:id'->setParameter (“id”邮票->getId ())->execute ();}公共函数拒绝(信封信封无效邮票信封->最后(TransportMessageIdStamp::类);如果(!邮票运算符TransportMessageIdStamp) {\ LogicException (“在信封上没有发现TransportMessageIdStamp。”);}//从"my_queue"表中删除消息->db->createQuery (DELETE FROM my_queue WHERE id =:id->setParameter (“id”邮票->getId ())->execute ();}公共函数发送(信封信封信封encodedMessage->序列化器->编码(信封);uuid= Uuid::uuid4 ()->toString ();//在"my_queue"表中添加一条消息->db->createQuery ('INSERT INTO my_queue (id, envelope, delivered_at, handled) VALUES (:id,:envelope, NULL, FALSE)'->setParameters ([“id”= >uuid“信封”= >encodedMessage“身体”),)->execute ();返回信封->(TransportMessageIdStamp (uuid));}}

上面的实现不是可运行的代码,但说明了如何TransportInterface可以实施。有关实际实现,请参见InMemoryTransport而且DoctrineReceiver

注册你的工厂

  • YAML
  • XML
  • PHP
1 2 3 4
#配置/ services.yaml服务:你\ \ YourTransportFactory运输:标签:(messenger.transport_factory)

使用交通工具

framework.messenger.transports。*配置,创建您的命名传输使用您自己的DSN:

  • YAML
  • XML
  • PHP
1 2 3 4 5
#配置/包/ messenger.yaml框架:信使:传输:你的:“my-transport: / /……”

除了能够将您的消息路由到你的发件人,这将使您访问以下服务:

  1. messenger.sender.yours:发送者;
  2. messenger.receiver.yours:接收器。
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。