2016-06-16 6 views
1

私はDancerからDancer2にアプリを移行しようとしています。私の考えは、コードをAjax(API)呼び出しであるものとテンプレートで処理される経路に分けることです。Dancer2アプリと異なるシリアライザ間でセッションデータを共有するにはどうすればよいですか?

マイベースアプリがある:私はRoutes::Templatesパッケージがどのシリアライザを持たないだろうとRoutes::Loginパッケージには、JSONのシリアル化を持っているだろうと考えていた

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

。私は

set serializer => 'JSON'; 

Routes::Loginパッケージで使用しました。

はしかし、私はまた、それぞれがそれぞれのファイルに共通appnameの

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を使用してアプリを組み合わせる必要はありません。両方のアプリがセッションエンジン用に同じ設定を使用している限り、セッションデータは共有されます。 (また、Dancer2でserializers are an all-or-nothing prospect、あなたが本当に2つの別々のアプリを使用するを持っているので)

ここで私は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)では、デフォルトの全部または無しのシリアライザの動作をオーバーライドできますが、ここでは必要ありませんあなたがアプリ内のすべてのルートに対してシリアライザを1つ使用すると、物事はより洗練されたものになると思います。 – ThisSuitIsBlackNot

+0

私はこれをテストケースで動作させ、それを私のものに適用しています。私はこれを追加して、これを動作させるためのテストスクリプトを入手したかったので、[クッキーを使ったテストに関するダンサーの文書](https://metacpan.org/pod)に示されているように、クッキーと再送信を保存する必要があります/distribution/Dancer2/lib/Dancer2/Manual/Testing.pod#Cookies) –

関連する問題