【问题标题】:How to set event name and delay time in Envelope?如何在信封中设置事件名称和延迟时间?
【发布时间】:2020-07-20 12:15:17
【问题描述】:

我正在使用 symfony 4 + enqueue (https://github.com/sroze/messenger-enqueue-transport + https://packagist.org/packages/enqueue/pheanstalk) 在 beanstalk 中运行异步作业。

现在我有:

/**
 * @var Symfony\Component\EventDispatcher\EventDispatcherInterface 
 */
private $eventDispatcher;

$event = new ArticleEvent("test title", "test description");
$this->eventDispatcher->dispatch($event, "article.publish");

但我希望延迟处理此作业。

文档让我像这样重构它:

use Enqueue\MessengerAdapter\EnvelopeItem\TransportConfiguration;
use Symfony\Component\Messenger\Envelope;

$event = new ArticleEvent("test title", "test description");
$transportConfig = (new TransportConfiguration())->setDeliveryDelay(5000);

$this->eventDispatcher->dispatch((new Envelope($event))->with($transportConfig));

这里的问题是我看不到在哪里放置活动名称 (article.publish)

(基于https://github.com/sroze/messenger-enqueue-transport#setting-custom-configuration-on-your-message

【问题讨论】:

    标签: php symfony symfony4 symfony-messenger


    【解决方案1】:

    使用 Messenger,您没有“事件名称”。

    您只需要发送适当的消息实例。

    如果您要发布文章,请构建一个 PublishArticle 命令或 ArticlePublished 事件,而不是使用通用的 ArticleEvent 类。

    两者之间的选择取决于您是注册事件(已经发生的事情)还是命令(您想要发生的事情)。

    Creating a handler for these messages 就像创建一个MessageHandlerInterface 实现类一样简单:

    use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
    
    class PublishArticleHandler implements MessageHandlerInterface
    {
        public function __invoke(PublishArticle $message)
        {
            // ... do some work - like publishing the article
        }
    }
    

    【讨论】:

    • 哦,那我怎么订阅呢?我正在使用使用事件名称的 getSubscribedEvents() 方法:symfony.com/doc/current/components/…
    • 如果您使用的是 Messenger,则需要创建消息处理程序。不要查看 Event Dispatcher 文档,而是查看 Symfony Messenger 文档。喜欢thisthis
    猜你喜欢
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 2021-12-31
    • 2014-04-20
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    相关资源
    最近更新 更多