2014-10-27 101 views
0

這裏是從lib文件夾中的myapp模塊:如何在Catalyst應用程序中初始化會話?

package myapp; 
use Moose; 
use namespace::autoclean; 
use Catalyst::Runtime 5.80; 
use Catalyst qw/ 
    ConfigLoader 
    Session 
    Session::Store 
    Session::State 
    Static::Simple 
/; 

extends 'Catalyst'; 
our $VERSION = '0.01'; 

__PACKAGE__->config(
    name => 'myapp', 
    # Disable deprecated behavior needed by old applications 
    disable_component_resolution_regex_fallback => 1, 
    enable_catalyst_header => 1, # Send X-Catalyst header 
); 

sub init { 
    my ($c) = @_; 
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(); 
    $c->session->{ed_year} = $year + 1900; 
} 

# Start the application 
__PACKAGE__->setup(); 
__PACKAGE__->init(); 

1; 

上面的例子是錯誤的,沒有可用的情況下($ C)。我想知道是否可以在其主模塊中的Catalyst應用程序中初始化會話。在這裏,我想初始化全局變量,稍後由視圖,模型和控制器使用?

此致 SK

回答

2

會話與用戶相關聯,並且是與該用戶交互的僞影。您無法在主程序中創建會話 - 正如您所說的那樣,此時沒有上下文。無論如何,我認爲你想要做的就是配置一些可供應用程序用戶使用的變量,因此它們是全局的,而不是用戶特定的。

使用__PACKAGE__->config - 這只是一個hashref,這就是它的用途。你當然不限於記錄的密鑰。

例如:

__PACKAGE__->config(
    name => 'myapp', 
    # Disable deprecated behavior needed by old applications 
    disable_component_resolution_regex_fallback => 1, 
    enable_catalyst_header => 1, # Send X-Catalyst header 
    ed_year => (localtime())[5] + 1900, 
    foo => { bar => 1, baz => 'quux' }, 
); 

在您的模型,視圖和控制器的值將作爲$c->config->{ed_year}$c->config->{foo}->{baz}等。

順便說一下,也許你使用ed_year只是一個簡單的例子,但考慮如何實例化:它將是服務器啓動的日期和時間,而不是當前請求的時間。如果後者是你想要的,把它放在你的Root.pm控制器的auto處理程序中。並且不要使用localtime來滾動自己,請使用DateTime模塊。