我正在尝试将应用从Dancer迁移到Dancer2。我的想法是将代码分离为使用模板和Ajax(API)调用的路由。
我的基本应用是:
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
包中的。
但是,我也希望这些共享会话数据,因此每个都有一个共同的appname
use Dancer2 appname => 'myapp';
在每个文件中。这似乎与序列化有关。 Routes::Template
路由未正确返回,因为它尝试编码为JSON。这是错误:
无法序列化内容:预期的hash-或arrayref(不是简单的标量,使用allow_nonref来允许)
我已阅读所有文档,包括:
但我还不清楚串行器是如何被包分开的。
答案 0 :(得分:0)
无需使用appname
组合您的应用;只要两个应用程序对会话引擎使用相同的配置,就会共享会话数据。 (另外,在Dancer2中为serializers are an all-or-nothing prospect,所以你真的 使用两个独立的应用。)
以下是我在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"}
表示两个请求都使用了相同的会话变量。