Mojolicious定制会议

时间:2012-01-05 14:05:54

标签: perl dbi mojolicious

我正在尝试使用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的数据库会话吗?

3 个答案:

答案 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,并且您可能希望使用不同的方法名称来避免冲突。