如何创建自己的信使运输
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 5.0,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何创建自己的信使运输
一旦编写了传输的发送方和接收方,就可以注册传输工厂,以便能够通过Symfony应用程序中的DSN使用它。ob娱乐下载
创建您的运输工厂
您需要给FrameworkBundle从DSN创建传输的机会。你将需要一个运输工厂:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
使用ob娱乐下载\组件\信使\运输\接收机\ReceiverInterface;使用ob娱乐下载\组件\信使\运输\发送方\SenderInterface;使用ob娱乐下载\组件\信使\运输\序列化\SerializerInterface;使用ob娱乐下载\组件\信使\运输\TransportFactoryInterface;使用ob娱乐下载\组件\信使\运输\TransportInterface;类YourTransportFactory实现了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
使用拉姆齐\Uuid\Uuid;使用ob娱乐下载\组件\信使\信封;使用ob娱乐下载\组件\信使\邮票\TransportMessageIdStamp;使用ob娱乐下载\组件\信使\运输\序列化\PhpSerializer;使用ob娱乐下载\组件\信使\运输\序列化\SerializerInterface;使用ob娱乐下载\组件\信使\运输\TransportInterface;类YourTransport实现了TransportInterface{私人$db;私人$序列化器;/ * * *@paramFakeDatabase $db用于演示目的。它不是一个真正的类。* /公共函数__construct(FakeDatabase$db, 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: / /……”
除了能够将您的消息路由到你的
发件人,这将使您访问以下服务:
messenger.sender.yours
:发送者;messenger.receiver.yours
:接收器。
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。