2016-06-16 72 views
1

我正在嘗試將一個應用程序從Dancer遷移到Dancer2。我的想法是將代碼分離爲使用模板和Ajax(API)調用的路由。如何在不同的串行器之間共享Dancer2應用程序之間的會話數據?

我的基本程序是:

use strict; 
use warnings; 
use FindBin; 
use Plack::Builder; 

use Routes::Templates; 
use Routes::Login; 

builder { 
    mount '/' => Routes::Templates->to_app; 
    mount '/api' => Routes::Login->to_app; 
}; 

我在想,在Routes::Templates包不會有任何串行和Routes::Login包將有JSON序列化。我用

set serializer => 'JSON'; 

Routes::Login包。

不過,我也希望這些共享會話數據,使每個人都有每個文件中常見的應用程序的名字

use Dancer2 appname => 'myapp'; 

。這似乎與串行化遇到麻煩。 Routes::Template路由未正確返回,因爲它試圖將其編碼爲JSON。這裏的錯誤:

Failed to serialize content: hash- or arrayref expected (not a simple scalar, use allow_nonref to allow this)

我讀過的所有文件,其中包括:

但我仍然沒有就如何串行明確被包分開。

回答

0

有沒有必要結合您的應用程序使用appname;只要兩個應用程序對會話引擎使用相同的配置,會話數據就會共享。 (另外,在serializers are an all-or-nothing prospect Dancer2,讓您真正使用兩個單獨的應用程序)

下面是我給的dancer-users mailing list的例子:

MyApp的/ lib目錄/ MyApp.pm

package MyApp; 
use Dancer2; 

our $VERSION = '0.1'; 

get '/' => sub { 
    session foo => 'bar'; 
    template 'index'; 
}; 

true; 

MyApp的/ LIB/MyApp的/ API.pm

package MyApp::API; 
use Dancer2; 

set serializer => 'JSON'; 

get '/' => sub { 
    my $foo = session('foo') // 'fail'; 
    return { foo => $foo }; 
}; 

true; 

MyApp的/ bin中/ app.psgi

#!/usr/bin/env perl 

use strict; 
use warnings; 
use FindBin; 
use lib "$FindBin::Bin/../lib"; 

use MyApp; 
use MyApp::API; 
use Plack::Builder; 

builder { 
    mount '/' => MyApp->to_app; 
    mount '/api' => MyApp::API->to_app; 
}; 

如果您訪問/路線,然後在同一瀏覽器的/api路線,你會得到

{"foo":"bar"} 

表明同一個會話兩個請求都使用了變量。

+0

[Dancer2 :: Plugin :: SendAs](https://metacpan.org/pod/Dancer2::Plugin::SendAs)允許您覆蓋默認的全有或全無序列化器行爲,但這裏沒有必要,並且我認爲當你堅持一個應用程序中所有路由的序列化程序時,事情會變得更加清晰。 – ThisSuitIsBlackNot

+0

我得到這個在測試用例中工作,並將其應用於我的。我想補充一點,爲了使測試腳本得到這個工作,你需要確保你保存了cookies並重新發送,如[使用cookies測試Dancer doc]所示(https://metacpan.org/pod /distribution/Dancer2/lib/Dancer2/Manual/Testing.pod#Cookies) –

相關問題