ssch/t3-messenger

Symfony Messenger 的包装器

安装次数: 10,736

依赖项: 1

建议者: 0

安全: 0

星标: 10

关注者: 3

分支: 2

开放问题: 7

类型:typo3-cms-extension

v2.0.1 2024-01-16 21:40 UTC

README

将 Symfony Messenger 集成到 TYPO3 https://symfony.ac.cn/doc/current/components/messenger.html

鸣谢

非常感谢 Constructiva Solutions GmbH 赞助了此扩展的开发,并提供了很多宝贵的反馈。

集成指南

该扩展基本上提供了与在 Symfony 框架中使用 messenger 相同的功能。为了配置 messenger,您需要在扩展的配置文件夹下放置一个 Messenger.php 文件。

return [
    'failure_transport' => 'failed',
    'default_bus' => 'command.bus',
    'transports' => [
        'async' => [
            'dsn' => 'typo3-db://Default',
        ],
        'failed' => [
            'dsn' => 'typo3-db://Default',
            'options' => [
                'queue_name' => 'failed',
            ],
        ],
    ],
    'routing' => [
        MyCommand::class => ['senders' => ['async']],
    ],
    'buses' => [
        'command.bus' => [
            'middleware' => [
                'id' => 'validation',
            ],
        ],
        'query.bus' => [
            'default_middleware' => [
                'enabled' => true,
                'allow_no_handlers' => false,
                'allow_no_senders' => true,
            ],
        ],
    ],
];

消息中的 Extbase 实体

如果您需要在消息中传递一个 Extbase 实体,最好传递实体的主键(或处理器实际需要的任何相关信息,如电子邮件等),而不是对象本身。

请参阅 Symfony 文档中关于 Doctrine 实体 的说明。

传输配置

Messenger 支持多种不同的传输类型,每种类型都有其自己的选项。可以通过 DSN 字符串或配置将选项传递给传输。

请参阅 Symfony 文档中关于 传输 的说明。

自定义 Doctrine 传输

该扩展附带了一个配置 DSN 略微修改过的 doctrine 传输。您不能使用 doctrine://,而必须使用 typo3-db://。

return [
    'transports' => [
        'async' => [
            'dsn' => 'typo3-db://Default',
        ],
    ],
];

格式为 typo3-db://<connection_name>,如果您有多个连接并且想使用除 "Default" 之外的一个,则适用。传输将自动创建一个名为 messenger_messages 的表。

请查阅 doctrine 传输 以获取进一步的配置细节。

空传输

该扩展还附带了一个 NullTransport。如果您想在某些实例中不处理某些消息,这很有用。

中间件

请参阅 Symfony 文档中关于 中间件 的说明,以了解其背后的概念。

该扩展附带了一个用于 extbase 验证器的 ValidationMiddleware。如果您想验证您的命令,请在您的 Messenger.php 中以下方式添加中间件

return [
    'buses' => [
        'messenger.bus.default' => [
            'middleware' => [
                'id' => 'validation',
            ],
        ],
    ],
];

注意:id 验证是服务 id messenger.middleware.validation 的快捷方式。

此外,该扩展还附带了一个用于调试目的的 LoggingMiddleware。

return [
    'buses' => [
        'messenger.bus.default' => [
            'middleware' => [
                'id' => 'logging',
            ],
        ],
    ],
];

异步邮件发送器

该扩展附带了一个自定义的 MessengerMailer,它实现了来自 TYPO3 核心的 MailerInterface,以便在需要时异步发送电子邮件。即使您使用的是 TYPO3 10,您也可以使用新的 MailerInterface。在您想要的地方注入 MailerInterface

use TYPO3\CMS\Core\Mail\MailerInterface;
use TYPO3\CMS\Core\Mail\MailMessage;
use TYPO3\CMS\Core\Utility\GeneralUtility;

final class RegistrationService
{
    private MailerInterface $mailer;

    public function __construct(MailerInterface $mailer)
    {
        $this->mailer = $mailer;
    }

    public function register()
    {
        $mailMessage = GeneralUtility::makeInstance(MailMessage::class);
        $mailMessage->setTo('max.mustermann@domain.com');
        $mailMessage->setSubject('You MailerInterface');
        $this->mailer->send($mailMessage);
    }
}

如果您以这种方式发送电子邮件,则不会发生变化。邮件将通过 MessengerBus 以之前的方式发送。您还可以注入来自 Symfony Mailer 的 MailerInterface,并将注入 MessengerMailer。

如果你真的想异步发送邮件,你必须配置你的 Messenger.php 中的路由部分。

return [
    'routing' => [
        \Symfony\Component\Mailer\Messenger\SendEmailMessage::class => ['senders' => ['async']],
    ]
]

天下没有免费的午餐。如果你要异步发送邮件,有一些注意事项需要处理。同时,也请查看 Symfony 文档 异步发送消息

注意:请确保在你的类中注入 \TYPO3\CMS\Core\Mail\MailerInterface 或 \Symfony\Component\Mailer\MailerInterface,并明确地将你的 MailMessage 传递给 send 方法。不要直接在 MailMessage 对象上调用 send 方法,因为这会绕过提供的装饰器,你将无法异步发送邮件。

配置提供者

如果你已经安装了 typo3/cms-lowlevel,你可以在配置模块中的 消息传递配置 部分看到你的消息传递配置。

你不仅可以查看系统范围的配置,还可以查看你的消息和分配的处理程序。

环境特定配置

如果你想在你的开发环境中同步处理消息(例如),但在生产环境中异步处理,你可以这样做。你只需要在你的扩展中在 Configuration/dev/ 下放置另一个 Messenger.php。你也可以通过在 Configuration/test/ 文件夹下放置 Messenger.php 来对测试环境做同样的事情。这是一个简单的约定,但在日常开发生活中非常方便。查看 在开发时处理同步消息 了解为什么这个功能如此方便。

进一步阅读

使用消息传递进行批处理

没有 Supervisor 的 Symfony 消息传递

鸣谢

在此存储库中使用到的图标由 [Freepik][8] 制作,来源自 [www.flaticon.com][9]