2013-03-05 3 views
2

Я хочу, чтобы иметь возможность определять глобальную переменную в моем приложении Catalyst, чтобы я мог получить доступ к ней на любом контроллере, в котором я находился. Целью этого является то, что я не повторяя значений вокруг моего приложения, которые по большей части никогда не меняются. В настоящее время я определяю переменные в my_app.pm так:variable application-wide variable

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 
} 

Имейте в виду, что ни один из методов неизменен, и когда вы говорите, «по большей части никогда не изменится», вы должны быть очень осторожны в среде веб-сервера, где у вас несколько постоянных процессов. Изменение таких значений программно может повлиять на последующие запросы, обработанные этим ребенком, и не влияют на других детей. Конечно, вы, вероятно, просто имели в виду, что «разработчик может время от времени изменять этот параметр».

Надеюсь, это полезно кому-то.

+0

Адрес эл. Почты: anks для вашего предложения, хотя на это уже был дан ответ.«По большей части никогда не изменяю», я имел в виду, что разработчик время от времени будет менять его, плохой выбор формулировок с моей стороны :) Считаете ли вы, что использование '__PACKAGE __-> config' лучше, чем просто объявление их как регулярные переменные, или это просто личное предпочтение? Кажется, это больше Catalyst-y :) – srchulo

+0

Я всегда объявляю эти «статические» переменные, используя '__PACKAGE __-> config'. В частности, если переменная, о которой идет речь, является настройкой конфигурации вашего приложения! Это, вероятно, личное предпочтение, но использование globals perl всегда * чувствует * как взломать меня и противоречит общему принципу инкапсуляции. – RET

2

Мне нравится управлять любым глобальным состоянием через плагин Catalyst. Причины:

  • Плагин позволяет получить/установить данные с помощью метода доступа.
  • Это позволяет избежать некоторых проблем безопасности при использовании пакета $: переменные
  • Этот код деблокирует, используя глобальное состояние, из сведений о том, где он хранится.
  • Плагины делают удобными места для размещения других функций, которые могут быть связаны с этим глобальным состоянием.
  • Плагины Catalyst на удивление просты в реализации.

Вот пример реализации, опираясь на предложение 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