【问题标题】:catalyst application-wide variable催化剂应用范围变量
【发布时间】:2013-03-05 07:31:50
【问题描述】:

我希望能够在我的Catalyst 应用程序中定义一个应用程序范围的(全局)变量,以便我可以在我所在的任何控制器中访问它。这样做的目的是我不重复值在我的应用程序周围,大部分情况下都不会改变。目前我正在my_app.pm 中定义变量,如下所示:

our $GLOBAL_VAR = 'value';

然后在我的控制器中,我尝试像访问子程序一样访问变量:

my_app::$GLOBAL_VAR

但是,这不起作用。有谁知道做到这一点的最佳方法,或者在 Catalyst 中实现这一目标的更好方法?谢谢!

【问题讨论】:

    标签: perl global-variables catalyst


    【解决方案1】:

    访问这样的全局变量是正确的语法:

    say $my_app::GLOBAL_VAR;
    

    【讨论】:

      【解决方案2】:

      我可以看到这个问题已经被问及回答了,但是还有其他方法可以达到这个问题的目的。

      就个人而言,我喜欢把这些东西放到主程序中:

      === my_app.pm ===
      
      __PACKAGE__->config->{GLOBAL_VAR} = 'value';
      
      
      === a nearby controller ===
      
      if($c->config->{GLOBAL_VAR} eq 'value'){ 
          # etc
      }
      

      请注意,这两种方法都不是一成不变的,当您说“大多数情况下永远不会改变”时,您需要在拥有多个持久进程的 Web 服务器环境中非常小心。以编程方式更改这些值可能会影响该孩子处理的后续请求,而不会影响其他孩子。当然,您可能只是说“开发人员可能会不时更改此参数”。

      希望这对某人有用。

      【讨论】:

      • 嘿,感谢您的建议,尽管这已经得到了回答。 “在大多数情况下永远不会改变”,我的意思是开发人员会不时改变它,我选择的措辞不好:)你认为使用__PACKAGE__->config比仅仅将它们声明为常规变量更好吗?还是只是个人喜好?它看起来确实更像催化剂 :)
      • 我总是使用__PACKAGE__->config 声明这些“静态”变量。特别是如果有问题的变量是您的应用程序的配置设置!这可能是个人喜好,但使用 perl 全局变量对我来说总是感觉,并且与封装的一般原则背道而驰。
      【解决方案3】:

      我喜欢通过 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');
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-03
        • 2016-09-08
        • 2020-01-05
        • 2020-12-14
        • 2013-04-10
        • 1970-01-01
        相关资源
        最近更新 更多