2011-09-07 8 views
5

Czy istnieje sposób, aby mieć jedną aplikację w tancerce, ale z wieloma appdirs.Wiele katalogów aplikacji z Dancer perl

Albo mógłby zrobić coś takiego:

mój projekt jest w katalogu „foo”. I powiedzmy, że mam dir 'bar' (nie wewnątrz 'foo'), który ma katalog o nazwie "public". Jaka jest moja aplikacja 'foo', aby użyć tej publiczności jako swojej własnej publiczności i jeśli wyszuka, powiedzmy, "/css/style.css" i nie znajduje się w "/ bar/public /", powinna przeszukać "/ foo/publiczny/'. Jak mogę to zrobić?

Odpowiedz

2

Jednym ze sposobów, aby napisać wtyczkę, która renderuje statyczny (i zastępuje niektóre funkcje). Przykładem może być Dancer::Plugin::Thumbnail.

Innym sposobem, jaki widzę, jest łatka w kształcie małpy get_file_response() pod numerem Dancer::Renderer, co nie jest zbyt dobrym pomysłem.

Poniższy kod wyszukuje pliki statyczne w każdym katalogu z tablicy @dirs. Jest brudny, brzydki i niebezpieczny. To może zostać zepsuty w przyszłej wersji i może powodować problemy z innymi częściami struktury Dancer, których nie znam. Jesteś ostrzeżony.

#!/usr/bin/env perl 
use Dancer; 
use Dancer::Renderer; 
use MyWeb::App; 

my $get_file_response_original = \&Dancer::Renderer::get_file_response; 
my @dirs = ('foo'); 

*Dancer::Renderer::get_file_response = sub { 
    my $app = Dancer::App->current; 

    my $result; 

    # Try to find static in default dir 
    if ($result = $get_file_response_original->(@_)) { 
     return $result; 
    } 

    # Save current settings 
    my $path_backup = $app->setting('public'); 

    # Go through additional dirs 
    foreach my $dir (@dirs) { 
     $app->setting(public => $dir); 
     if ($result = $get_file_response_original->(@_)) { 
      last; 
     } 
    } 

    # Restore public 
    $app->setting('public' => $path_backup); 

    return $result 
}; 

dance; 

sposoby trzecie to niech nginx po prostu zrobić to za Ciebie w formie pisemnej właściwego config Nginx dla danej aplikacji.

+0

Chodzi o to, że oba katalogi powinny pozostać rozdzielone. – bliof

+0

@bliof Zaktualizowałem moją odpowiedź, możesz spróbować, ale lepiej pójdź z nginxem. – yko

+0

Myślałem o czymś innym. Czy mogę stworzyć "foo" wtyczkę i użyć jej w "barze"? Prawdziwe pytanie brzmi, czy wtyczka Dancer ma funkcjonalność aplikacji tancerzy. Mam na myśli możliwość zmapowania adresu URL i załadowania szablonów z folderu "widoki"?/Nigdy nie napisałem wtyczki/ – bliof

7

OK, oto dobry sposób na zrobienie tego. Może to być oczywiście wtyczka.

Nigdy nie powinno się robić tego typu rzeczy przez hacking wewnątrz rdzenia Dancera, należy raczej zawsze rozważyć wdrożenie obsługi trasy, aby wykonać zadanie:

#!/usr/bin/env perl 
use Dancer; 
use File::Spec; 
use Dancer::FileUtils 'read_file_content'; 
use Dancer::MIME; 
use HTTP::Date; 

# your routes here 

# then the catchall route for 
# serving static files 

# better in config 
my @public_dirs = qw(/tmp/test/foo /tmp/test/bar /tmp/test/baz); 

get '/**' => sub { 
    my $path = request->path; 
    my $mime = Dancer::MIME->instance; 

    # security checks 
    return send_error("unauthrorized request", 403) if $path =~ /\0/; 
    return send_error("unauthrorized request", 403) if $path =~ /\.\./; 

    # decompose the path_info into a file path 
    my @path = split '/', $path; 

    for my $location (@public_dirs) { 
     my $file_path = File::Spec->catfile($location, @path); 

     next if ! -f $file_path; 

     my $content = read_file_content($file_path); 
     my $content_type = $mime->for_file($file_path); 
     my @stat = stat $file_path; 

     header 'Content-Type', $content_type; 
     header 'Content-Length', $stat[7]; 
     header 'Last-Modified', HTTP::Date::time2str($stat[9]); 
     return $content; 
    } 

    pass; 
}; 

start; 

Przykładem takiej aplikacji uruchomiony:

$ mkdir -p /tmp/test/foo /tmp/test/bar /tmp/test/baz 
$ echo 1 > /tmp/test/foo/foo.txt 
$ echo 2 > /tmp/test/bar/bar.txt 
$ echo 3 > /tmp/test/baz/baz.txt 
$ ./bin/app.pl 
$ curl -I http://0:3000/baz.txt 
HTTP/1.0 200 OK 
Content-Length: 2 
Content-Type: text/plain 
Last-Modified: Fri, 14 Oct 2011 11:28:03 GMT 
X-Powered-By: Perl Dancer 1.3051 
Powiązane problemy