Как установить имя события и время задержки в конверте? - PullRequest
1 голос
/ 08 апреля 2020

Я использую symfony 4 + enqueue (https://github.com/sroze/messenger-enqueue-transport + https://packagist.org/packages/enqueue/pheanstalk) для запуска асин c заданий в 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 )

1 Ответ

1 голос
/ 08 апреля 2020

С мессенджером у вас нет «имен событий».

Вам просто нужно отправить соответствующий экземпляр сообщения.

Если вы публикуете статью, вместо того, чтобы иметь общий c ArticleEvent class, создайте команду PublishArticle или событие ArticlePublished.

Выбор между ними зависит от того, регистрируете ли вы событие (что-то уже произошло) или команду (что-то, что вы должно произойти).

Создать обработчик для этих сообщений так же просто, как создать MessageHandlerInterface реализующий класс:

use Symfony\Component\Messenger\Handler\MessageHandlerInterface;

class PublishArticleHandler implements MessageHandlerInterface
{
    public function __invoke(PublishArticle $message)
    {
        // ... do some work - like publishing the article
    }
}
...