2016-06-16 8 views
1

Ich versuche eine App von Dancer zu Dancer2 zu migrieren. Mein Gedanke ist, den Code in Routen zu trennen, die mit Vorlagen und solchen, die Ajax (API) -Aufrufe sind, bedient werden.Wie kann ich Sitzungsdaten zwischen Dancer2-Apps mit verschiedenen Serialisern teilen?

Meine Basis-App ist:

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

Ich dachte, dass das Routes::Templates Paket keine Serializer haben würde und das Routes::Login Paket würde JSON Serialisierung haben. Ich verwendete

set serializer => 'JSON'; 

im Routes::Login Paket.

Allerdings möchte ich auch diese Session-Daten teilen, so dass jeder eine gemeinsame appname hat

use Dancer2 appname => 'myapp'; 

in jeder Datei. Und das scheint Probleme mit der Serialisierung zu haben. Die Routes::Template Routen werden nicht korrekt zurückgegeben, da versucht wird, sie als JSON zu codieren. Hier ist der Fehler:

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

ich alle Unterlagen gelesen haben, darunter diese:

Aber ich bin immer noch nicht klar, wie die Serializer ist durch Paket getrennt.

Antwort

0

Sie müssen Ihre Apps nicht mit appname kombinieren; Sitzungsdaten werden freigegeben, solange beide Apps dieselbe Konfiguration für die Sitzungs-Engine verwenden. (. Auch serializers are an all-or-nothing prospect in Dancer2, so dass Sie wirklich haben zwei getrennte Anwendungen zu verwenden)

Hier ist das Beispiel, das ich gab auf dem dancer-users mailing list:

MeineAnw/lib/MyApp.pm

package MyApp; 
use Dancer2; 

our $VERSION = '0.1'; 

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

true; 

MeineAnw/lib/MyApp/API.pm

package MyApp::API; 
use Dancer2; 

set serializer => 'JSON'; 

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

true; 

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

Wenn Sie die / Route durch die im gleichen Browser /api Route gefolgt zugreifen, werden Sie

{"foo":"bar"} 

darauf hinweist, dass die gleiche Sitzung erhalten Variable wurde von beiden Anfragen verwendet.

+0

[Dancer2 :: Plugin :: SendAs] (https://metacpan.org/pod/Dancer2::Plugin::SendAs) erlaubt es Ihnen, das standardmäßige Alles-oder-Nichts-Serializer-Verhalten zu überschreiben, aber hier ist es nicht notwendig und ich denke, die Dinge sind sauberer, wenn Sie für alle Routen in einer App einen Serializer verwenden. – ThisSuitIsBlackNot

+0

Ich habe das im Testfall arbeiten lassen und verwende es für meinen. Ich wollte hinzufügen, dass um ein Testskript zu erhalten, damit dies funktioniert, Sie sicherstellen müssen, dass Sie Cookies speichern und erneut senden, wie in [the Dancer doc zum Testen mit Cookies] gezeigt (https://metacpan.org/pod) /distribution/Dancer2/lib/Dancer2/Manual/Testing.pod#Cookies) –