【问题标题】:How to initialize a session in Catalyst application?如何在 Catalyst 应用程序中初始化会话?
【发布时间】:2016-02-03 10:45:56
【问题描述】:

这是 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

【问题讨论】:

    标签: perl catalyst


    【解决方案1】:

    会话与用户相关联,并且是与该用户交互的工件。您不能在主程序中创建会话-正如您正确地说的那样,此时没有上下文。无论如何,我认为您想要做的是配置一些变量,这些变量将可供应用程序的任何用户使用,因此它们是全局的,而不是特定于用户的。

    使用__PACKAGE__->config - 它只是一个哈希引用,这就是它的用途。您当然不限于记录在案的密钥。

    例如:

    __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 模块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-20
      • 2014-12-29
      • 1970-01-01
      • 2011-06-10
      • 2013-07-02
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      相关资源
      最近更新 更多