2012-01-05 36 views
3

我想與Mojolicious使用數據庫會話,而不是使用正在使用簽名cookie的內置數據庫會話。Mojolicious定製會話

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; 
       }); 

而且我想用session對象就像在控制器$self->session$self->app->session

不幸的是,它不起作用 - 它使用以前的會話(來自不同的瀏覽器)。

這讓我發瘋 - 今天我試過的所有文檔都是這樣 - 我已閱讀所有可用的文檔,也是MojoX::Session及其所有相關類的源代碼,嘗試以大約923847293847239847的方式使其工作,但似乎沒有任何事情做到。

PS:我在db中創建了session表。

你知道我應該怎麼做才能使用Mojolicious的數據庫會話嗎?

回答

1

$app->session方法保留用於使用內置會話。

你應該看看Mojolicious helpers,你可能想使用不同的方法名稱來避免衝突。

3

你可以使用任何你喜歡的會話後端。只要創建從Mojolicious得出自己的控制器基類::控制器和覆蓋會話(),像這樣:

package NiceController; 
use Mojo::Base 'Mojolicious::Controller'; 
sub session { # custom code here } 
1; 

然後在啓動(),設置您的控制器類作爲默認:

$self->controller_class('NiceController'); 

最後,請確保您的應用程序控制器繼承自NiceController而不是Mojolicious ::控制器

將重寫的session()函數與內置函數一起使用可能是一個好主意,以避免將來發生混淆。

-xyz

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'); 
+0

我怎麼比其他控制器的其他文件訪問會話。謝謝! – PMat 2012-09-05 13:55:32