2013-03-05 79 views
2

我希望能夠在我的Catalyst應用程序中定義一個應用程序範圍(全局)變量,以便我可以在任何控制器中訪問它。目的是爲了不會重複我的應用程序的價值,大多數情況下永遠不會改變。目前,我定義變量my_app.pm像這樣:催化劑應用範圍變量

our $GLOBAL_VAR = 'value'; 

然後在我的控制器,我嘗試訪問變量,就像我會子程序:

my_app::$GLOBAL_VAR 

但是,這是行不通的。有沒有人知道這樣做的最好方法,或者在Catalyst中實現這一點的更好方法?謝謝!

回答

4

到這裏訪問這樣一個全局變量是正確的語法:

say $my_app::GLOBAL_VAR; 
4

我可以看到這個已經被問和回答,但也有其他方法來實現這一問題的目的。

就個人而言,我喜歡把這些東西放到主程序這樣的:

=== my_app.pm === 

__PACKAGE__->config->{GLOBAL_VAR} = 'value'; 


=== a nearby controller === 

if($c->config->{GLOBAL_VAR} eq 'value'){ 
    # etc 
} 

要知道,無論方法是不變的,當你說:「在大多數情況下不會改變」,你需要在具有多個持久性進程的Web服務器環境中非常小心。以編程方式更改此類值可影響該子級處理的後續請求,並且不會影響其他子級。當然,你可能只是指「開發者可能不時地改變這個參數」。

希望對某人有用。

+0

嘿,th儘管這已經得到了解答,但您仍然可以提出建議。通過「絕大多數情況下永不改變」,我的意思是開發人員會不時地改變它,在我的部分的措辭選擇不當:)你認爲使用'__PACKAGE __-> config'比只聲明它們更好常規變量,還是僅僅是個人偏好?它似乎更多的催化劑-Y :) – srchulo 2013-03-07 04:16:33

+0

我總是使用'__PACKAGE __-> config'聲明這些'靜態'變量。特別是如果有問題的變量是你的應用程序的配置設置!這可能是個人偏好,但是使用perl全局變量總是感覺*對我來說就像是黑客,並且違背了封裝的一般原則。 – RET 2013-03-07 04:51:39

2

我喜歡通過Catalyst插件管理任何類型的全局狀態。理由:

  • 插件允許您通過訪問器方法獲取/設置數據。
  • 這可以避免使用$ package :: variables的一些安全問題
  • 這使用全局狀態從存儲位置的細節中解耦代碼。
  • 插件爲放置可能與該全局狀態有關的其他功能提供了一個方便的地方。
  • 催化劑插件實現起來非常容易。

這裏是一個示例實現,建立在RET的建議使用 - >配置:

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'); 
} 
+0

謝謝!這是一個很好的解決方案。我會牢記在心:) – srchulo 2016-11-12 23:44:05