Почему контент объединяется в Mojo :: Template? - PullRequest
0 голосов
/ 14 января 2019

В приложении Mojolicious я использую шаблоны для генерации XML для запросов к веб-службам Exchange.

В одном случае я должен выполнить два цикла запроса template => один за другим, и похоже, что во втором вызове содержимое первого вызова объединяется с содержимым второго, искажая результаты.

Это решится, если я установлю поле mojo.content тайника в пустую строку после того, как я отрендерил вещи (см. «ПОЧЕМУ ЭТО НУЖНО» в первом фрагменте.

Почему это? Код следует (откорректировано для ясности, я надеюсь).

В одной упаковке:

use Mojo::Base 'Mojolicious::Plugin';

sub user_location {
    my ($self, $c, $name) = @_;

    my $url = Mojo::URL->new($c->app->config->{root});
    my $xml = $c->render_to_string(template => 'xml/whois', format => "xml", name => $name);

    #----------------------
    # WHY IS THIS NEEDED?
    #----------------------
    $c->stash->{'mojo.content'} = undef;

    my $ua  = Mojo::UserAgent->new();
    my $tx = $ua->post($url => {'Content-Type' => 'text/xml', 'Accept-Encoding' => 'None' } => $xml);

    if ($tx->res->is_success) {
        # do things
        # return result
    }
}

В другой упаковке:

use Mojo::Base 'Mojolicious::Controller';

sub get_freebusy {
    my $c = shift;

    my $loc = $c->user_location;

    my $tx = $c->get_ews('xml/calendar');

    if ($tx->res->is_success) {
        # do things
        # return result
    }
}

и еще один пакет:

sub register {
    my ($self, $app, $conf) = @_;


    $app->helper('get_ews' => sub {
         my $c = shift;
         my $template = shift;
         my $url = Mojo::URL->new($c->app->config->{root});
         my $ua  = Mojo::UserAgent->new();
         my $xml = $c->render_to_string(template => $template, format => "xml");

         my $tx = $ua->post($url => {'Content-Type' => 'text/xml', 'Accept-Encoding' => 'None' } => $xml);

         if ($tx->res->is_success) {
             unless ($tx->res->dom->at('ResponseCode')->all_text eq 'NoError') {
                 $tx->res->code(500);
             }
         } else {
             # handle error
         }
         return $tx;
     });
}    
...