• Как записать сообщение в очередь rabbit из обработчика?

    @svetbc92 Автор вопроса
    BoShurik, у меня стоит и psalm и phpstan и phpmd и phpcode_sniffer, но их надо запускать из консоли. Всё время забываю, а IDE настроить не удалось :(
  • Как записать сообщение в очередь rabbit из обработчика?

    @svetbc92 Автор вопроса
    BoShurik, да, действительно ошиблась :) он имеет тип стринг (во всем виноват копипаст :) ). Исправила ошибку, но всё без изменений. Жаль, что там не срабатывает дебагер :(
  • Как записать сообщение в очередь rabbit из обработчика?

    @svetbc92 Автор вопроса
    BoShurik, посмотрите пожалуйста:
    // Контроллер
    public function __construct(
        private readonly MessageBusInterface $bus,
        private LoggerInterface $logger,
        private readonly SendTemplateMailer $sendTemplateMailer,
        private readonly TemplateRepository $templateRepository
    ) {
    }
    
    #[Route('/test-rabbit/{id}', name: 'create_image', methods: ['GET'])]
    public function testRabbit(Image $image): array
    {
        $this->logger->info('Test 1'); // тут сообщение логируется
    
        $template = $this->templateRepository->findOneBy(['uuid' => $image->getUuid()]);
        $this->sendTemplateMailer->sendTemplate($template); // тут сообщение приходит на почту
    
        try {
            $this->bus->dispatch(new SendOneMessage($image->getId()));
        } catch (Exception $e) {
            return ['status' => false, 'message' => $e->getMessage()];
        }
    
        return ['status' => true];
    }
    
    // Обработчики
    
    #[AsMessageHandler]
    class OneJobHandler implements MessageHandlerInterface
    {
        public function __construct(
            private readonly ImageRepository $imageRepository,
            private LoggerInterface $logger,
            private readonly MessageBusInterface $bus
        ) {
        }
    
        public function __invoke(SendOneMessage $message)
        {
            $this->logger->info('Test 2'); // в обработчике уже не логируется тут и дальше
    
            $image = $this->imageRepository->find($message->imageId);
    
            $image
                ->setDescription('Test')
                ->setDateUpdate(new DateTime())
            ;
    
            $this->imageRepository->save($image, true);
    
            $this->bus->dispatch(new SendTwoMessage($image->getUuid()));
    
            $this->logger->info('Test 3');
        }
    }
    
    #[AsMessageHandler]
    class TwoJobHandler implements MessageHandlerInterface
    {
        public function __construct(
            private readonly TemplateRepository $templateRepository,
            private LoggerInterface $logger,
            private readonly SendTemplateMailer $sendTemplateMailer
        ) {
        }
    
        public function __invoke(SendTwoMessage $message)
        {
            $this->logger->info('Test 4');
    
            $template = $this->templateRepository->findOneBy(['uuid' => $message->templateUuid]);
    
            $this->sendTemplateMailer->sendTemplate($template); // тут уже сообщение не отправляется, хотя тот же шаблон
    
            $this->logger->info('Test 5');
        }
    }
    
    // Mailer
    class SendTemplateMailer
    {
        public function __construct(
            private readonly Environment $twig,
            private readonly MailerInterface $mailer,
            private readonly string $emailFrom,
            private readonly LoggerInterface $logger
        ) {
        }
        
        public function sendTemplate(Template $template): void
        {
            $this->logger->info('Test 6'); // это сообщение появляется в логе, только когда метод вызывается из контроллера
    
            $email = (new Email())
                ->from($this->emailFrom)
                ->to($this->emailFrom)
                ->subject('Тестовое сообщение')
                ->html(
                    $this
                        ->twig
                        ->load('/Email/test.html.twig')
                        ->render(
                            [
                                'uuid' => $template->getUuid(),
                                'title' => $template->getTitle(),
                                'description' => $template->getDescription()
                            ]
                        )
                )
            ;
    
            $this->mailer->send($email);
        }
    }
  • Как записать сообщение в очередь rabbit из обработчика?

    @svetbc92 Автор вопроса
    BoShurik, провела тесты, получилось отправить второе сообщение. Сделала тест с изменением данных в БД, оба обработчика изменили свои таблицы. Пыталась отловить запуск сообщений спомощью LoggerInterface, но почему-то в обработчиках логи не пишутся :( и так же не отрабатывает метод sendTemplate, не подскажите почему так? Хотя если писать логи из контроллера, то всё нормально, так же с методом sendTemplate, он корректно работает из контроллера.
  • Как записать сообщение в очередь rabbit из обработчика?

    @svetbc92 Автор вопроса
    BoShurik, это переместилось во время разработки) В конфигах тоже актуальная информация.
  • Как записать сообщение в очередь rabbit из обработчика?

    @svetbc92 Автор вопроса
    BoShurik, не судите строго) Никакой сложной логики, я пока только тестирую новую для себя технологию)

    // Контроллер
    public function __construct(private readonly MessageBusInterface $bus)
    {
    }
    
    #[Route('/test-rabbit/{id}', name: 'create_image', methods: ['GET'])]
    public function testRabbit(Image $image): array
    {
        try {
            $this->bus->dispatch(new SendOneMessage($image->getId()));
        } catch (Exception $e) {
            return ['status' => false, 'message' => $e->getMessage()];
        }
    
        return ['status' => true];
    }
    
    // Обработчики
    #[AsMessageHandler]
    class OneJobHandler implements MessageHandlerInterface
    {
        public function __construct(
            private readonly ImageRepository $imageRepository,
            private readonly MessageBusInterface $bus
        ) {
        }
    
        public function __invoke(SendOneMessage $message)
        {
            $image = $this->imageRepository->find($message->imageId);
    
            $image
                ->setDescription('Test')
                ->setDateUpdate(new DateTime())
            ;
    
            $this->imageRepository->save($image, true);
    
            $this->bus->dispatch(new SendTwoMessage($image->getUuid()));
        }
    }
    
    #[AsMessageHandler]
    class TwoJobHandler implements MessageHandlerInterface
    {
        public function __construct(
            private readonly TemplateRepository $templateRepository,
            private readonly SendTemplateMailer $sendTemplateMailer
        ) {
        }
    
        public function __invoke(SendTwoMessage $message)
        {
            $template = $this->templateRepository->findOneBy(['uuid' => $message->templateUuid]);
    
            $this->sendTemplateMailer->sendTemplate($template);
        }
    }
    
    // Messages
    
    class SendOneMessage
    {
        public int $imageId;
    
        public function __construct(int $imageId)
        {
            $this->imageId = $imageId;
        }
    }
    
    class SendTwoMessage
    {
        public int $templateUuid;
    
        public function __construct(int $templateUuid)
        {
            $this->templateUuid = $templateUuid;
        }
    }


    Логика такая: Контроллер передает идентификатор изображения и передает его в rabbit, далее первый обработчки вносит изменения в сущность (что бы я могла понять, что обработчик выполнил работу). Далее кладу второе сообщение во вторую очередь с идентификатором шаблона. Второй обработчки достает этот шаблон по uuid и отправляет сообщение на email. В методе sendTemplate тоже элементраная логка, а имеено заполняется твиг шаблон и отправляется сообщение на почту с помощью symfony/mailer (этот метод рабочий).
  • Как записать сообщение в очередь rabbit из обработчика?

    @svetbc92 Автор вопроса
    BoShurik, без запуска команды php bin/console messenger:consume, сообщение отправляется, но обработчик не запускается. А как запуститится обработчик в таком случае? (без запуска консьюмера)

    63da8bcd57e07494253321.png
    63da8d5db1a25280989550.png
  • Как записать сообщение в очередь rabbit из обработчика?

    @svetbc92 Автор вопроса
    BoShurik, получю ошибку "You cannot receive messages from the Messenger SyncTransport."

    ###> symfony/messenger ###
    MESSENGER_TRANSPORT_DSN=sync://user:password@amqp:5672/%2f/messages
  • Как записать сообщение в очередь rabbit из обработчика?

    @svetbc92 Автор вопроса
    tukreb, спасибо! Нашла, но там только 1 сообщение SendOneMessage, там не видно что отправляется второе сообщение во вторую очередь.

    63d8e7f9d1187969828574.png