2

Catalystアプリケーションでアプリケーション全体(グローバル)変数を定義して、使用している任意のコントローラーでアクセスできるようにしたいと思います。これの目的は、アプリの周囲で次のような値を繰り返さないことです。ほとんどの部分は決して変わりません。現在、私は次のmy_app.pmように変数を定義しています:

our $GLOBAL_VAR = 'value';

次に、コントローラーで、サブルーチンと同じように変数にアクセスしようとします。

my_app::$GLOBAL_VAR

ただし、これは機能しません。誰かがこれを行うための最良の方法、またはCatalystでこれを達成するためのより良い方法を知っていますか?ありがとう!

4

3 に答える 3

5

これはすでに質問され、回答されていることがわかりますが、この質問の目的を達成する方法は他にもあります。

個人的に、私はこれらのものをメインプログラムに入れるのが好きです:

=== my_app.pm ===

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


=== a nearby controller ===

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

どちらの方法も不変であることに注意してください。「ほとんどの場合、変更しない」と言うときは、複数の永続的なプロセスがあるWebサーバー環境では十分に注意する必要があります。このような値をプログラムで変更すると、その子によって処理される後続の要求に影響を与える可能性があり、他の子には影響を与えません。もちろん、あなたはおそらく単に「開発者がこのパラメータを時々変更するかもしれない」という意味でした。

それが誰かに役立つことを願っています。

于 2013-03-07T01:39:24.310 に答える
5

このようなグローバル変数にアクセスするには、正しい構文を使用します。

say $my_app::GLOBAL_VAR;
于 2013-03-05T07:59:40.977 に答える
2

私はCatalystプラグインを介してあらゆる種類のグローバル状態を管理するのが好きです。理由:

  • プラグインを使用すると、アクセサメソッドを介してデータを取得/設定できます。
  • これにより、$ package::variablesを使用する際の安全上の問題の一部が回避されます。
  • これにより、グローバル状態を使用するコードが、保存場所の詳細から切り離されます。
  • プラグインは、そのグローバル状態に関連する可能性のある他の機能を配置するための便利な場所になります。
  • Catalystプラグインは、驚くほど簡単に実装できます。

PACKAGE- >configを使用するという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');
}
于 2016-11-12T18:34:22.523 に答える