Dancer2:从存储在 YAML 会话中的哈希中获取嵌套数据

Dancer2: fetching nested data from hash stored in YAML session

我正在使用 Dancer2 和 YAML 会话引擎。我使用以下代码在会话中存储了完整的哈希值:

post '/login' => sub {
    # ...
    my $userdata = {
        fname => 'John',
        lname => 'Doe',
        uid => 1234,
    };
    # ...
    session userdata => $userdata;
    # ...
}

省略的代码根据数据库和 returns $userdata hashref 检查登录数据。 此代码在 $appdir/sessions 下创建一个会话文件,内容如下:

会话文件

userdata:
  fname: John
  lname: Doe
  uid: 1234

如何在我的 app.pm 文件中从该会话中检索单个值? 它在模板文件 (*.tt) 中运行良好,<% session.userdata.fname %> 产生 John,正如预期的那样。 但是,我想获取 app.pm 中的名字,如下所示:

get '/userdetails' => sub {
    my $firstname = session('userdata.fname'); # gives undef
    # do sth. with $firstname
}

可行吗?或者我必须

my $userdata = session('userdata'); # fetch complete hash
# do sth. with $userdata->{fname}

我试过了

但其中 none 工作并给予了 undef。手册和教程只获取 "first level values",不获取嵌套的。

Template Toolkit 语法完全独立于 Perl Dancer2,您应该期望任何形式的寻址都可以继承。作为 YAML 文件的数据来源也无关紧要,因为 Dancer 会话只是一个 Perl 哈希结构

手册没有说的很清楚,但是

session('userdata')

相同
session->{userdata}

所以你可以使用

session->{userdata}{fname}

阅读附属字段

(如果您愿意,也可以 session('username')->{fname},但这对我来说有点恶心!)

请注意,您不应在生产代码中使用 YAML 会话引擎,因为它非常慢