如何在Catalyst应用程序中初始化会话?

时间:2014-10-27 19:13:46

标签: perl catalyst

这是lib文件夹中的myapp模块:

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

1 个答案:

答案 0 :(得分: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只是一个简单的例子,但考虑如何实例化:它将是服务器启动的日期和时间,而不是当前请求的时间。如果后者是您想要的,请将其放在auto控制器的Root.pm处理程序中。并且不要使用localtime滚动自己,使用DateTime模块。

相关问题