4

我正在尝试使用 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:我在session数据库中创建了表。

你知道我应该怎么做才能在 Mojolicious 中使用 DB 会话吗?

4

3 回答 3

6

您可以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');
于 2012-01-18T01:48:17.117 回答
4

您可以使用您喜欢的任何类型的会话后端。只需创建您自己的从 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

于 2012-01-05T18:09:24.597 回答
1

$app->session方法保留用于使用内置会话。

你应该看看Mojolicious 助手,你可能想使用不同的方法名来避免冲突。

于 2012-01-05T14:12:27.783 回答