我如何反序列化 Symfony 传输消息?

问题描述 投票:0回答:1

我想反序列化表messenger_messages中的Symfony消息。

我尝试使用 unserialize() 函数,但收到一条通知:“unserialize(): Error at offset 0 of 1380 bytes in ...”(消息剪切)。

结果我只有通知,而不是传递给函数的未序列化字符串。

这是我尝试反序列化的示例(出于隐私原因我更改了一些数据):

O:36:\"Symfony\\Component\\Messenger\\Envelope\":2:{s:44:\"\0Symfony\\Component\\Messenger\\Envelope\0stamps\";a:1:{s:46:\"Symfony\\Component\\Messenger\\Stamp\\BusNameStamp\";a:1:{i:0;O:46:\"Symfony\\Component\\Messenger\\Stamp\\BusNameStamp\":1:{s:55:\"\0Symfony\\Component\\Messenger\\Stamp\\BusNameStamp\0busName\";s:26:\"messenger.bus.pimcore-core\";}}}s:45:\"\0Symfony\\Component\\Messenger\\Envelope\0message\";O:36:\"App\\Hubspot\\TransactionalMailMessage\":1:{s:45:\"\0App\\Hubspot\\TransactionalMailMessage\0payload\";a:4:{s:7:\"emailId\";i:53540933612;s:9:\"recipient\";a:7:{s:5:\"email\";s:23:\"[email protected]\";s:5:\"phone\";s:10:\"3289736434\";s:9:\"firstName\";s:5:\"Sequi\";s:8:\"lastName\";s:7:\"Lorenzo\";s:12:\"customerType\";s:7:\"privato\";s:17:\"newsletterConsent\";b:1;s:5:\"admin\";b:0;}s:4:\"data\";a:13:{s:11:\"ID_ANNUNCIO\";i:5920;s:14:\"TOKEN_ANNUNCIO\";s:15:\"PR65E095202E52F\";s:15:\"TITOLO_ANNUNCIO\";s:41:\"Agazzini ENDURO CARBON CANE CREEK EDITION\";s:12:\"EMAIL_AUTORE\";s:23:\"[email protected]\";s:15:\"TELEFONO_AUTORE\";s:10:\"3289736434\";s:12:\"URL_ANNUNCIO\";s:39:\"http://localhost/announcement/5920/view\";s:17:\"URL_ANNUNCIO_EDIT\";s:39:\"http://localhost/announcement/5920/edit\";s:18:\"URL_ANNUNCIO_ADMIN\";s:65:\"https://www.ebikemood.com/admin/login/deeplink?object_5920_object\";s:6:\"STATUS\";s:6:\"review\";s:15:\"NOTE_UNAPPROVED\";s:0:\"\";s:13:\"NOTE_REJECTED\";s:0:\"\";s:11:\"OFFER_PRICE\";s:0:\"\";s:17:\"OFFER_DESCRIPTION\";s:0:\"\";}s:6:\"sendId\";N;}}}
php symfony serialization
1个回答
0
投票

首先,检查您的配置中使用了哪个序列化器,例如

framework:
    messenger:
        serializer: ??? # <- HERE

如果未显式设置,消息组件将使用其默认的内部序列化器:

Symfony\Component\Messenger\Transport\Serialization\Serializer

现在,棘手的部分是它需要特定格式的编码信封:

[
    'body' => '',
    'headers' => ['type' => '', 'X-Message-Stamp-A' => '', 'X-Message-Stamp-B' => '', ...],
]

如果您不使用任何其他元数据(如邮票等),您现在可以简单地注入 Serializer 并尝试手动创建信封并解码消息:

$result = $this->serializer->decode([
    'body' => 'yourSerializedMessageString',
    'headers' => ['type' => \get_class(YourMessageObject)],
]);

否则,您需要使用消息中的所有标头填充“headers”元素(如果您可以从任何地方绕过信使组件获取)。

© www.soinside.com 2019 - 2024. All rights reserved.