[Moscow.pm] Очередной вопрос новичка о Mojolicious
iSage
isage на aumi.ru
Вт Мар 20 10:10:08 PDT 2012
Охххх...
$r->any('/abc/:cde', {cde => qr/\d+/} )->to('module#foo');
On Tue, 20 Mar 2012 20:57:48 +0400, Ivan Petrov
<i.petro.77.00 на gmail.com> wrote:
> если для стешей (то есть плейсхолдеры в урле), то можно что-то в таком
> духе делать (кусок выдран прямо из проекта):
>
> $self->routes->add_condition(
> number => sub {
> my ($r, $c, $captures, $pattern) = @_;
> $pattern = [ $pattern ] unless ref $pattern eq 'ARRAY';
> for (@$pattern) {
> return unless exists $captures->{$_};
> return unless $captures->{$_} =~ /^\d+$/;
> return unless $captures->{$_};
> }
> return 1;
> }
> );
>
> $self->routes->add_condition(
> like => sub {
> my ($r, $c, $captures, $pattern) = @_;
> return unless 'HASH' eq ref $pattern;
> for (keys %$pattern) {
> return unless exists $captures->{$_};
> if ('Regexp' eq ref $pattern->{$_}) {
> return unless $captures->{$_} =~ $pattern->{$_};
> next;
> }
> return unless $captures->{$_} =~ /\Q$pattern->{$_}\E/;
> }
> return 1;
> }
> );
>
>
> первый кондишен проверяет на корректность id-шники (должна быть
> цифра), второй на соответствие регулярному выражению.
>
> использование какое-то такое:
>
> $r->any('/abc/:cde')
> ->over(number => 'cde')
> ->to('module#foo');
>
> $r->any('/abc/:cde/:def')
> ->over(number => [ 'cde', 'def' ])
> ->to('module#foo');
>
> $r->get('/abc/:cde')
> ->over(like => { cde => qr{^\d+$} })
> ->to('module#foo');
>
> Получается когда неправильное что-то в урле задано, то просто 404
> отвечается и все.
>
> Интересно, кто-то оборачивал валидаторы для стешей в плагин? типа
> самое употребимое (а-ля вышеприведенный лайк и проверка id-шников)
Подробная информация о списке рассылки Moscow-pm