>> $r->any('/abc/:cde', {cde => qr/\d+/} )->to('module#foo');

В таких случаях я обычно пишу:

$r->any('/abc/:cde', {cde => qr/[1-9][0-9]*/} )->to('module#foo');

20 марта 2012 г. 20:24 пользователь Ivan Petrov
<[email protected]>написал:

>
> $r->> any('/abc/:cde', {cde => qr/\d+/} )->to('module#foo');
>
> да это понятно. просто тут либо eq, либо регулярник.
>
> а нам надо было что если там просто скаляр, то он тоже является
> регулярником, ну и с числами получается функция по сути.
>
> наиболее частые случаи в плагин бы запхать интересно бы было
>
> > On Tue, 20 Mar 2012 20:57:48 +0400, Ivan Petrov
> > <[email protected]> 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 mailing list
> > [email protected] | http://moscow.pm.org
> --
> Moscow.pm mailing list
> [email protected] | http://moscow.pm.org
>



-- 
С уважением, Александр
Личный блог: http://eax.me/
Мой форум: http://it-talk.org/
Мой Twitter: http://twitter.com/afiskon
-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить