这是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
答案 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
模块。