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

Perl 如何在Catalyst应用程序中初始化会话?,perl,catalyst,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';

以下是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

会话与用户关联,是与该用户交互的产物。您不能在主程序中创建会话-正如您正确地说的,在这一点上没有上下文。在任何情况下,我认为您想要做的是配置应用程序的任何用户都可以使用的一些变量,因此它们是全局的,而不是特定于用户的

使用
\uuuuuuuuuuuuuuuuuuuuu包\uuuuuuuuuu->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}
等形式提供

顺便说一下,也许您使用的<代码> EdSyth只是一个简单的例子,但是考虑一下它是如何被实例化的:它将是服务器启动的日期和时间,而不是当前请求的时间。如果您想要后者,请将其放入

Root.pm
控制器的
auto
处理程序中。不要使用
localtime
,使用
DateTime
模块