Symfony Messenger 和 Mailer:如何添加绑定密钥?

2024-02-18

我有一个正在运行的 Symfony 4.4 项目,其中包含Messenger和rabbitMQ。 我有一个带有 2 个队列的异步传输。

    transports:
        # https://symfony.com/doc/current/messenger.html#transport-configuration
      async:
        dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
        options:
          exchange:
            name: myexchange
            type: direct
          queues:
            email:
              binding_keys:
                - email
            extranet:
              binding_keys:
                  - extranet
        # failed: 'doctrine://default?queue_name=failed'
        # sync: 'sync://'

    routing:
        # Route your messages to the transports
        'App\Message\ExtranetMessage': async
        'Symfony\Component\Mailer\Messenger\SendEmailMessage': async

我需要发送电子邮件symfony/mailer电子邮件队列的组件。

public function contact(Request $request, MailerInterface $mailer)
{
    if($request->isXmlHttpRequest())
    {
        //dd($request->request->all());
        $body =
            'Nouveau message depuis le front<br />
             Nom = '.$request->request->get('nom').'<br />
             Prénom = '.$request->request->get('prenom').'<br />
             Société = '.$request->request->get('societe').'<br />
             Email = '.$request->request->get('mail').'<br />';

        $email = (new Email())
            ->from('[email protected] /cdn-cgi/l/email-protection')
            ->replyTo($request->request->get('mail'))
            ->to('$request->request->get('mail')')
            ->subject('test')
            ->html($body);

        $mailer->send($email);

        return new JsonResponse('OK', 200);
    }
}

如何将绑定密钥添加到mailer为了让rabbitMQ知道如何处理电子邮件?


可以指定路由键通过邮票 https://symfony.com/doc/current/messenger.html#amqp-transport。不幸的是,邮件程序集成没有公开添加它们的方法,它只是将消息分派到默认队列。但您仍然可以手动发送消息:

$this->dispatchMessage(new SendEmailMessage($email), [new AmqpStamp('email')]);

这种方法有一些局限性:因为这没有使用mailer code, MessageEvent不会发送,并且分析器中的“电子邮件”窗格将为空。

另一种选择是使用中间件添加标记:

  1. 创建中间件
// src/Messenger/StampEmailMessageMiddleware.php
class StampEmailMessageMiddleware implements MiddlewareInterface
{
    const bindingKey = 'email';

    public function handle(Envelope $envelope, StackInterface $stack): Envelope
    {
        // Add the stamp. Since the middleware gets called both when dispatching and 
        // consuming the message, we make sure there's no stamp already added.
        if (
            $envelope->getMessage() instanceof SendEmailMessage && 
            null === $envelope->last(AmqpStamp::class)
        ) {
            $envelope = $envelope->with(new AmqpStamp(self::bindingKey));
        }

        return $stack->next()->handle($envelope, $stack);
    }
}

  1. 将中间件添加到总线配置中:
# config/packages/messenger.yaml
messenger:
    buses:
        messenger.bus.default:
            middleware:
                - 'App\Messenger\StampEmailMessageMiddleware'

  1. 正常发送消息:
$mailer->send($email);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Symfony Messenger 和 Mailer:如何添加绑定密钥? 的相关文章

随机推荐

  • 是否可以通过 UI 将新字段添加到 bigquery 中 RECORD 类型的现有字段中?

    是否可以向 bigquery 中的 RECORD 类型的现有字段添加新字段 例如 如果我当前的架构是 u fields u mode u NULLABLE u name u test1 u type u STRING u fields u
  • Ruby 中的自定义日志记录最佳实践

    在 Ruby 中管理自定义日志记录的最佳实践是什么 我应该对记录器进行猴子补丁来做我想做的事吗 或者从它延伸出来 还是委托 红宝石的方法是什么 我厌倦了为此而定制的黑客 我想要更干净 更优雅的东西 贝茨有一个截屏视频 http railsc
  • 链接 OpenCV 4.1.0,包含有效,库无效

    将 Ubuntu 从 16 04 更改为 18 04 将 OpenCV 从 3 4 1 更改为 4 1 0 后 我无法编译 任何东西 一步步 我从 github 下载了源代码 设置了这些标志 cmake D CMAKE BUILD TYPE
  • 字符串上的 Python hash() 函数

    CPython2 7中如何计算某个特定字符串的哈希值 例如 这段代码 print hash abcde 1000 即使我重新启动 Python 进程并重试 我做了很多次 也会返回相同的值 所以 看来id 此计算中不使用字符串的 内存地址 对
  • 如何在 Mongoose 模式中设置数组大小限制

    您能否告诉我在创建 Mongoose 模式时是否有任何方法可以设置数组大小的限制 例如 var peopleSchema new Schema name type String required true default true here
  • 将 DefaultIfEmpty 与对象一起使用?

    我在 MSDN 上看到了一个示例 如果没有返回任何内容 它可以让您指定默认值 见下文 List
  • 如何用JavaScript检测屏幕分辨率?

    有没有一种方法适用于所有浏览器 原答案 Yes window screen availHeight window screen availWidth update2017 11 10 From Tsunamis https stackove
  • Jboss一步步设置热部署

    您好 我想问一下如何配置 jboss 服务器以进行实时 热部署 每次当我更改 jsp html js 或 css 文件的某些代码时 我总是需要清理和构建项目 而不是一次又一次地将项目部署到 jboss 这花费了我很多时间 我为此浪费时间 当
  • 将 R 数据框中的列表扩展到数据框中的其他行?

    In a 今天早些时候单独提出问题 https stackoverflow com questions 34206003 how to flatten r data frame that contains lists我问如何将嵌套列表展平为
  • 何时使用 low < high 或 low + 1 < high for 循环不变式

    我读过多篇文章 包括 Jon Bentley 的二分搜索章节 这就是我对正确的二分搜索逻辑的理解 它在我所做的简单测试中有效 binarysearch arr low high k 1 while low lt high 2 mid low
  • 防止在 C++ 中递归调用 main()

    我有一个类似的代码如下 int main some code motors int motors if condition some code main else if condition some code main else main
  • 高级过滤器 - 排除标头

    我有一个执行高级过滤器的宏 我怎样才能从中排除标题 我尝试改变C C to C2 C但它不起作用 Sub extractuniquevalues2 Dim wks As Excel Worksheet Dim wksSummary As E
  • 调整窗口大小时防止画布清除

    我正在尝试创建一个简单的应用程序 在 Canvas 标签内绘制矩形 我已将画布大小调整为全屏 但每当我调整视口大小时 画布都会清除 我试图阻止它被清除并只保留其中的内容 有任何想法吗 http mediajux com experiment
  • Angular 2 显示图像数组

    我是 Angular 2 的新手 我有一个图像数组 我想连续显示所有图像 但即使数组不为空 也没有显示任何图像 我正在使用 img 标签 如代码所示 html代码 div div div div div img src image div
  • 在 Python 中最大化 WebDriver (Selenium 2)

    我正在尝试编写一个简单的脚本 检查我是否有任何标记为 某事 的 gmail 电子邮件 然后打开一个 Firefox 浏览器窗口到登录页面 然后转到其他页面 这就是我正在做的 from selenium import webdriver fr
  • 将运算符从字符串类型转换为运算符类型

    我想随机生成这样的东西 233 333 566 我的意思是第一个数字和运算符以及第二个数字是随机生成的 所以 我现在写了这段代码 var x parseInt Math random 1000 y parseInt Math random
  • .NET core 不支持 BeginInvoke? (平台不支持异常)

    我已将 FluentFTP 库移植到 NET 标准 NET 核心 但异步方法在 async await 块中使用 BeginInvoke 所以它是这样的 async ConnectAsync BeginConnect void BeginC
  • django admin - 编辑或查看模型的组权限

    我正在寻找一种自定义 Django 管理以支持基于用户组的权限的方法 例如 我刚刚创建了 Developers 组 现在我还创建了 Tickets 模型 并使用 AdminModel 来指定如何列出数据 我想让这个模型仅对开发人员可见 并且
  • AJAX GET 无法使用本地 JSON 文件?

    我有一个 JSONP URL 它正在提取数据并刚刚切换到本地 JSON 文件 现在我收到错误 我不明白为什么它不能使用本地 JSON 文件
  • Symfony Messenger 和 Mailer:如何添加绑定密钥?

    我有一个正在运行的 Symfony 4 4 项目 其中包含Messenger和rabbitMQ 我有一个带有 2 个队列的异步传输 transports https symfony com doc current messenger htm