[Kiev-pm] Данные из конфига считываются с позиции предыдущего обхода (mojolicious)
Cyrill Novgorodcev
cynovg at gmail.com
Sat Oct 27 13:27:29 PDT 2012
Здравствуйте.
Написал небольшое тестовое приложение,что бы объяснить свою проблему.
основной модуль приложения lib/SmallTest.pm
package SmallTest;
use Mojo::Base 'Mojolicious';
sub startup {
my $self = shift;
$self->plugin( 'Config' );
my $r = $self->routes;
$r->get('/')->to('example#welcome');
}
1;
и контроллер lib/SmallTest/Example.pm
package SmallTest::Example;
use Mojo::Base 'Mojolicious::Controller';
#use Data::Dumper;
sub welcome {
my $self = shift;
my $test = 0;
# $self->app->log->debug( Dumper( $self->config->{ test } ) );
while ( my ( $key, $val ) = each %{ $self->config->{ test } } ) {
if ( $test =~ $key ) {
$test = $val;
last;
}
}
$self->render( message => $test );
}
1;
файл конфига small_test.conf:
{
test => {
0 => 'x00',
1 => 'x11',
2 => 'x22',
},
}
шаблон вывода templates/example/welcome.html.epl
% layout 'default';
<h2><%= $message %></h2>
Теперь достаточно запустить и просто обновлять (рефрешить) окно, что
бы увидеть, что данные из конфига считываются с позиции предыдущего
обхода. То есть, если в предыдущий раз было найдено вхождение и был
осуществлен принудительный выход из цикла, то в след. раз обход
продолжится с следующего (относительно первого обхода) значения, те
значения, которые были использованы в первом поиске - в текущем уже
учитываться не будут. Т.к. с следующей позиции вхождение не удастся
найти, то поиск завершится неудачей и только при третьем обновлении,
то есть в следующий раз снова будет начат с первой позиции.
В качестве костыля достаточно выводить дамп в лог (раскомментировать
строки) и все чудесным образом начинает работать так, как и
задумывалось. Если запускать приложение в cgi-окружении, то проблема
не возникает. Но, даже банальный тест (см ниже) не проходит, т.к.
используется внутренний сервер.
тест-файл t/01-def.t
use strict;
use warnings;
use Test::More 'no_plan';
use Test::Mojo;
my $t = Test::Mojo->new( 'SmallTest' );
$t->get_ok('/')->status_is(200)->text_is( 'h2' => 'x00' );
$t->get_ok('/')->status_is(200)->text_is( 'h2' => 'x00' );
Теперь, собственно, вопрос: это нормальное поведение?
PS: Тестовое приложение можно взять на гитхабе
git clone https://github.com/cynovg/SmallTest
--
Всего хорошего!
More information about the Kiev-pm
mailing list