我喜欢通过 Catalyst 插件管理任何类型的全局状态。原因:
- 插件允许您通过访问器方法获取/设置数据。
- 这避免了使用 $package::variables 的一些安全问题
- 这将使用全局状态的代码与其存储位置的详细信息分离。
- 插件为放置可能与该全局状态相关的其他功能提供了方便的位置。
- Catalyst 插件非常容易实现。
这是一个示例实现,基于 RET 使用PACKAGE ->config 的建议:
package YourApp::Catalyst::Plugin::MyGlobalState;
sub global_state {
my $c = shift;
if(@_) { # If passed an argument, set.
$c->config->{global_state} = shift;
}
return $c->config->{global_state};
}
1;
然后在您的主应用程序中:
package YourApp;
use Catalyst (
...
'+YourApp::Catalyst::Plugin::GlobalState'
);
然后在某处的控制器中:
sub my_action {
my $c = shift;
my $global_state = $c->global_state;
$c->global_state('new state');
}