gpt4 book ai didi

perl - 如何访问 Mojolicious 模型中的 session 数据

转载 作者:行者123 更新时间:2023-12-01 06:43:09 25 4
gpt4 key购买 nike

下面是一个 Mojolicious (6.14) 应用程序示例...对于 $_[0] 和其他不尽如人意的做法感到抱歉;我试着让它变得紧凑。

package ScopeTest;
use Mojo::Base 'Mojolicious';

sub startup {
my $app = shift;

$app->helper( hello => sub { "Hello!" } );
$app->helper( username => sub { $_[0]->session('username'); } );
$app->helper( model => sub { ScopeTest::Model->new( app => $_[0]->app ) } );
$app->helper( hasPerm => sub { $_[0]->model->hasPerm( @_ ) } );

$app->routes->get('/alice')->to('controller#alice');
$app->routes->get('/carol')->to('controller#carol');
$app->routes->get('/steve')->to('controller#steve');
}

##############################
package ScopeTest::Controller;
use Mojo::Base 'Mojolicious::Controller';

sub alice { $_[0]->session( username => "alice" ); $_[0]->render_message() }
sub carol { $_[0]->session( username => "carol" ); $_[0]->render_message() }
sub steve { $_[0]->session( username => "steve" ); $_[0]->render( text =>
sprintf "%s: %s\n", $_[0]->username, $_[0]->model->update_db ? 'Okay' : 'Fail' ) }

sub render_message { $_[0]->render( text =>
sprintf "%s: %s\n", $_[0]->username, $_[0]->hasPerm('canLogin') ? 'Okay' : 'Fail' ) }

##############################
package ScopeTest::Model;
use Mojo::Base -base;

has 'app';

my %perms = ( alice => [ qw{ canLogin } ],
carol => [ ],
steve => [ qw{ canUpdateDB } ] );

sub hasPerm {
my ( $self, $perm ) = @_;
no warnings 'uninitialized';

$self->app->log->debug("app->hello = " . $self->app->hello ); # OKAY
$self->app->log->debug("app->username = " . $self->app->username ); # FAILS
$self->app->log->debug("session('username') = " . $self->app->session('username') ); # FAILS
$self->app->log->debug("session->{'username'} = " . $self->app->session->{'username'} ); # FAILS

my $username; # = $self->app->username;
return grep { $_ eq $perm } @{ $perms{$username} };
}

sub update_db {
my ( $self, $data ) = @_;
$self->hasPerm('canUpdateDB') or return;
# else ...
return 1;
}

1;

虽然像 $self->app->log->debug()$self->app->dumper() 和其他帮助程序做的是正确的事情,$self->app->session 没有。

我知道传入 $app 被认为不太理想,但我希望以上内容至少可以工作...

除了一遍又一遍地传递用户名(这是一个玩具示例;真正的应用程序有许多不同的方法,有时会相互调用,等等)是否有一种更清晰的方法来从模型类中访问 session 数据?

PS — 在你说之前,Model->new(username => $self->session('username'),这意味着知道,先验,我需要什么 session 变量,并在构造函数和属性列表中枚举它们;我希望如果我只是传入整个 $app(甚至 $app->session),我可以让事情永不过时。

谢谢!

最佳答案

我犯的错误是:“ session ”信息与应用程序无关;它与 Controller 相关联:

$app->helper( model => sub { ScopeTest::Model->new( ctrl => $_[0] ) } );

然后:

package ScopeTest::Model;
use Mojo::Base -base;

has 'ctrl';

...
$self->ctrl->app->log->debug("username = " . $self->ctrl->username );

是的,我知道将 Controller 传递给 Model 仍然不是最佳选择,但这至少解释了为什么我之前根本无法让它工作......

关于perl - 如何访问 Mojolicious 模型中的 session 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31691071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com