[Moscow.pm] Очередной вопрос новичка о Mojolicious

Ivan Petrov i.petro.77.00 на gmail.com
Вт Мар 20 09:57:48 PDT 2012


On 11:04 Tue 20 Mar     , Тимофей Марков wrote:
> Точнее о Mojolicious::Lite

> Приветствую уважаемый Moscow.pm. Прошу простить за еще один нубский вопрос но
> самостоятельно додуматься у меня не получается. : <http://perl5doc.ru/cpan/
> Mojolicious::Lite" style="text-decoration:none">Как проверить данные, которые я
> забираю из адресной строки с помощью команды param. Как то так:

> $user = $self->param('user');

> Цель моя - фильтровать служебные символы (безопасности ради).
> Я почти уверен что в Mojolicious есть готовое решение для этого, ну или
> устоявшееся красивое решение(а может все автоматом проверяется?). Допустим с
> помощью if и регулярок я б решил задачу, но моему решению будет очень далеко до
> изящности и краткости, потому и прошу помощи.
> Заранее Благодарен.
> Тимофей

если для стешей (то есть плейсхолдеры в урле), то можно что-то в таком
духе делать (кусок выдран прямо из проекта):

    $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