我正在尝试使用Mojolicious的数据库会话,而不是使用已签名cookie的内置数据库会话。
在startup
子例程中,我有类似的内容:
my $dbh = DBI->connect(
$config->{database}->{dsn},
$config->{database}->{user},
$config->{database}->{password},
);
my $session = MojoX::Session->new(
store => [dbi => {dbh => $dbh}], # use MojoX::Session::Store::Dbi
transport => 'cookie', # this is by default
ip_match => 1
);
(ref($self))->attr( 'session' => sub {
return $session;
} );
我想在控制器中使用会话对象,如$self->session
或$self->app->session
。
不幸的是它不起作用 - 它使用以前的会话(来自不同的浏览器)。
这让我发疯了 - 我今天尝试的只是让这项工作 - 我已经阅读了所有可用的文档,也是MojoX::Session
及其所有相关类的来源,尝试了大约923847293847239847种方法来实现它工作,但似乎没有做到。
PS:我在db中创建了session
表。
你知道我应该做些什么才能使用Mojolicious的数据库会话吗?
答案 0 :(得分:5)
您可以将MojoX::Session
作为startup
函数中的插件连接到应用程序。
use Mojolicious::Plugin::Session;
[...]
sub startup {
my $self = shift;
[...]
$self->plugin( session => {
stash_key => 'mojox-session',
store => [dbi => {dbh => $dbh}], # use MojoX::Session::Store::Dbi
transport => 'cookie',
ip_match => 1
});
[...]
之后,您将通过控制器中的存储键“mojox-session
”访问会话。
例如:
$self->stash('mojox-session')->data('something');
答案 1 :(得分:3)
您可以使用您喜欢的任何类型的会话后端。只需创建一个派生自Mojolicious :: Controller的控制器基类,并覆盖session(),如下所示:
package NiceController;
use Mojo::Base 'Mojolicious::Controller';
sub session { # custom code here }
1;
然后在startup()中,将控制器类设置为默认值:
$self->controller_class('NiceController');
最后,确保您的应用程序控制器继承自NiceController而不是Mojolicious :: Controller
让被覆盖的session()函数与内置函数一样工作可能是一个好主意,以避免将来出现混淆。
-xyz
答案 2 :(得分:1)
$app->session
方法保留用于使用内置会话。
您应该查看Mojolicious helpers,并且您可能希望使用不同的方法名称来避免冲突。