Php Throuway PubSub是否允许在发布前修改消息?

Php Throuway PubSub是否允许在发布前修改消息?,php,websocket,ratchet,thruway,Php,Websocket,Ratchet,Thruway,聊天应用程序示例 A先生(2017年8月7日15:01):大家好 B先生(2017年8月7日15:20):你好,A先生 服务器插入服务器日期时间(dd-mmm-yyy-hh:mm)。我可以用棘轮轻松完成。 在OnPublish中,我可以在真正发布之前修改消息 高速公路也能做到吗?我找不到任何Throuway文档,我看到了示例,但没有找到我想要的。我想如果我需要实现这一点,我会使用稍微不同的体系结构。我相信WAMP的想法是让路由器非常通用。这就是为什么我们没有这样的例子 所有特定于应用程序的代码

聊天应用程序示例

A先生(2017年8月7日15:01):大家好
B先生(2017年8月7日15:20):你好,A先生

服务器插入服务器日期时间(dd-mmm-yyy-hh:mm)。我可以用棘轮轻松完成。

在OnPublish中,我可以在真正发布之前修改消息


高速公路也能做到吗?我找不到任何Throuway文档,我看到了示例,但没有找到我想要的。

我想如果我需要实现这一点,我会使用稍微不同的体系结构。我相信WAMP的想法是让路由器非常通用。这就是为什么我们没有这样的例子

所有特定于应用程序的代码都应该驻留在WAMP应用程序组件中,而不是路由器本身 -托拜厄斯

话虽如此,做你想做的事情仍然不太困难,但需要拦截消息。理想情况下,覆盖代理会很好,但是我们现在没有一个通用的方法来切换它。因此,我们可以覆盖路由器并检查每条消息:

class MyRouter extends Router {
    public function onMessage(TransportInterface $transport, Message $msg) {
        if ($msg instanceof PublishMessage) {
            if ($msg->getTopicName() == "mytopic") {
                // mangle the message in here
            }
        }

        parent::onMessage($transport, $msg);
    }
}
然后在启动时使用这个类而不是默认的路由器


我还没有尝试过这个代码,如果我有机会,我会的。不过这个想法应该行得通。

是的,正如马特提到的,WAMP路由器不应该包含特定于应用程序的代码,因为这破坏了WAMP的基本设计。这就是说,让路由器向发布的事件添加时间戳(当配置为这样做时)是可能的——但不是在事件的应用程序负载中,而是在WAMP
事件的
详细信息
字段中()。然后可以在订阅者中访问它。拥有“事件时间戳”将足以证明这样的添加是合理的。如果对“事件时间戳”感兴趣,我们应该首先在WAMP高级配置文件中描述它(在WAMP repo上添加问题之后),然后WAMP路由器实现可以选择实现该功能。正是为了这种东西,我们设计了WAMP2,使其具有可扩展性:我们有一个
EVENT.details | dict
,可以在不破坏东西的情况下放置额外的东西。不理解
详细信息
dict中某个字段的客户端将忽略该字段-或者更简单:将完整的
详细信息
转发到应用程序代码。谢谢Matt和oberstet。我现在明白了。因此,获取“标准”时间的正确方法不应该来自WAMP路由器,我可以创建一个“getStandardTime”RPC,它位于正在运行的Thurway客户端中。只有在客户准备消息发布之前才调用它,这样更好吗?最后,我明白了。PubSub应100%保留“订阅者看到的就是发布者给出的”。我想破坏东西的意图是错误的。谢谢。@VirtualJasper当然可以在后端应用程序组件中有一个
getStandardTime
过程。事件的发布者可以调用该过程,将时间插入事件的应用程序负载中,然后才发布。这在今天是可能的,没有任何变化。但是,发布者可以“伪造”时间(不调用
getStandardTime
)。使用上面的“事件时间戳”,任何东西都不能伪造(只要您信任路由器,这是不可避免的)。订户可以确保时间是正确的。如果你信任你的出版商,那么这不是问题。