【问题标题】:How to create 'globally' scoped variables that are global only during one request?如何创建仅在一个请求期间全局的“全局”范围变量?
【发布时间】:2019-01-20 12:37:02
【问题描述】:

当一个请求到达我的 dancer2 应用程序时,我想设置一个对象,该对象可由处理此请求所涉及的所有包访问。

如何确保此对象仅在此单个请求中具有范围,并且其他请求无法访问?

具体来说,当执行通过我的库时,该对象应填充各种消息(错误、警告、调试消息等)。

显然,这些消息是特定于请求的,我担心天真地声明对该消息对象的全局引用会将其暴露给所有访问应用程序的请求。

我正在考虑在路由器中创建此消息类的实例,然后在处理此请求所涉及的所有方法中传递对它的引用。

我的直觉告诉我,我在架构方面缺少关于 dancer2 的一些基本内容,所以我决定问你。顺便说一句,这是我在这里的第一篇文章,所以对于我的问题可能存在的任何不足之处,我深表歉意。

【问题讨论】:

  • 嗨@Joe,您的描述听起来像是您正在寻找一种记录消息的方法...如果是这样,请查看所有可用的Dancer2::Logger::* 的精美模块...如果不是,那么当你试图传递东西时,这肯定是错误的方式。
  • 嗨@vanHoesel,谢谢。但我希望我的库完全与 dancer2 无关。事实上,我正在实现一个我想独立于 dancer2 使用的 API,正如 ysth 在他的回答中正确假设的那样。

标签: perl dancer


【解决方案1】:

在我看来,您可以使用 var 来保存您的对象。

https://metacpan.org/pod/distribution/Dancer2/lib/Dancer2/Manual.pod#var

如果您需要即使不知道 Dan​​cer 的方法也可以访问它,您可以使用 var 并使用弱引用将您的对象存储在全局变量中。

【讨论】:

  • 所以var 是一个请求范围的对象(一个哈希引用,如果我记得Data::Dumper 的输出的话)。这是有道理的。一旦我再次访问我的开发环境并报告回来,我将尝试它。希望明天。关于弱引用:从未使用过它们,直到现在-受您的帖子启发-我读到了它们。谢谢 - 正如我所说:我会回来报告。
  • 使用 var 作为 API 入口点的引用正是我想要的: var API => AMS2::API->new;后来在我的路线中,我使用: del '/record/:id' => sub { vars->{API}->do_what_needs_to_be_done(route_parameters->get('id'));最好的,乔
猜你喜欢
  • 2012-04-29
  • 1970-01-01
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
相关资源
最近更新 更多