<div dir="ltr">Как уже показывал - можно подсмотреть в <a href="http://v32.rusrails.ru/action-controller-overview/filters" target="_blank" style="font-size:19.2px">http://v32.rusrails.ru/<wbr>action-controller-overview/<wbr>filters</a><br><br>Для чего это очень удобно:<div><br>Например, маршруты get one, put, patch, delete скорее всего требуют одинакового действия - загрузки экземпляра сущности, для дальнейших действий над ним, либо возврата HTTP::Status::HTTP_NOT_FOUND.<div><br></div><div>Пример тоже уже скидывал:<br><span style="font-size:19.2px"><br><font face="monospace, monospace">use HTTP::Status qw( </font></span><font face="monospace, monospace">HTTP_NOT_FOUND <span style="font-size:19.2px">);</span></font></div><div><font face="monospace, monospace"><span style="font-size:19.2px"><br>before_filter extract_message => sub {</span><br style="font-size:19.2px"><span style="font-size:19.2px">    my $self = shift;</span><br style="font-size:19.2px"><span style="font-size:19.2px">    my $</span><span style="font-size:19.2px">message</span><span style="font-size:19.2px"> = MyModel::Message->find( $self->param('</span><span style="font-size:19.2px">id') )</span></font><div style="font-size:19.2px"><font face="monospace, monospace">        or do {<br>            $self->render( json => { success => \0, error => 'Not found' }, status => HTTP_NOT_FOUND );</font></div><div style="font-size:19.2px"><font face="monospace, monospace">            return; # nok</font></div><div style="font-size:19.2px"><font face="monospace, monospace">        };<br>    $self->stash( <span style="font-size:19.2px">message</span> => $<span style="font-size:19.2px">message</span> );<br>    return 1; # ok, filter proceed successfully<br></font><div><font face="monospace, monospace">};<br><br>get '/<span style="font-size:19.2px">message</span>/:id' => { filter => '<span style="font-size:19.2px">extract_message</span>' }, sub {</font></div></div><div style="font-size:19.2px"><font face="monospace, monospace">    my $self = shift;</font></div><div style="font-size:19.2px"><font face="monospace, monospace">    my $message = $self->stash('message'); # We always have message here!</font></div><div style="font-size:19.2px"><font face="monospace, monospace"><span style="font-size:19.2px">};</span><br></font></div><div style="font-size:19.2px"><font face="monospace, monospace"><br></font></div><div style="font-size:19.2px"><div><font face="monospace, monospace">put '/template/:id' => { filter => '<span style="font-size:19.2px">extract_message</span>' }, sub {</font></div><div style="font-size:19.2px"><font face="monospace, monospace">    my $self = shift;</font></div><div style="font-size:19.2px"><font face="monospace, monospace">    my $message = $self->stash('message'); <span style="font-size:19.2px"># We always have message here!</span></font></div><div><font face="monospace, monospace"><span style="font-size:19.2px">};</span><br></font></div></div><div style="font-size:19.2px"><font face="monospace, monospace"><br></font></div><div style="font-size:19.2px"><div><font face="monospace, monospace">delete '/template/:id' => { filter => [ '<span style="font-size:19.2px">extract_message</span>' ] }, sub {</font></div><div><font face="monospace, monospace">    my $self = shift;</font></div><div><font face="monospace, monospace">    my $message = $self->stash('message'); <span style="font-size:19.2px"># We always have message here!</span></font></div><div><font face="monospace, monospace">};</font></div></div><br></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">6 декабря 2016 г., 17:06 пользователь Konstantin S. Uvarin <span dir="ltr"><<a href="mailto:khedin@gmail.com" target="_blank">khedin@gmail.com</a>></span> написал:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_default" style="font-family:monospace,monospace">Приветствую!<br><br></div><div class="gmail_default" style="font-family:monospace,monospace">  Я так понял, фильтры - это хуки, которые втыкаются на определённый путь и все нижележащие пути? С одной стороны, руки уже чешутся написать, с другой, там очень легко перегнуть палку и сделать чересчур... <br><br></div><div class="gmail_default" style="font-family:monospace,monospace">  Но спасибо за идею. <br></div></div><div class="gmail_extra"><br><div class="gmail_quote"><span class="">2016-12-03 1:00 GMT+02:00 Akzhan Abdulin <span dir="ltr"><<a href="mailto:akzhan.abdulin@gmail.com" target="_blank">akzhan.abdulin@gmail.com</a>></span>:<br></span><div><div class="h5"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Не хватает фильтров, как минимум (в том же Mojo они тоже туповаты, каждый over перекрывает предыдущие, вместо расширения).<br><br></div><div><br></div>На досуге почитайте <a href="http://www.sinatrarb.com/intro.html" target="_blank">http://www.sinatrarb<wbr>.com/intro.html</a><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">2 декабря 2016 г., 17:39 пользователь Konstantin S. Uvarin via Moscow-pm <span dir="ltr"><<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>></span> написал:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="m_-8423858727687299633h5"><div dir="ltr"><div class="gmail_default" style="font-family:monospace,monospace">Приветствую всех! <br><br>Сегодня я бы хотел представить веб-фреймворк на перл 5 собственного сочинения, Ниф (Not Even A Framework). Написан он больше для самообразования, т.к. и так их как собак нерезаных, но мне кажется, в нём есть некие здравые идеи. Суть такова:<br><br>1. Приложение разбивается на маленькие процедуры-хэндлеры, привязанные к пути в URI (см. тж. <a href="https://metacpan.org/pod/Dancer" target="_blank">https://metacpan.org/pod/Dance<wbr>r</a> )<br><br>2. Хэндлер получает на вход объект запроса, из которого потом достаются параметры, куки, заголовки и т.д. (см. тж. <a href="https://metacpan.org/pod/Kelp" target="_blank">https://metacpan.org/pod/Kelp</a> )<br><br>3. Параметры и куки нельзя достать без валидации, например, при помощи регулярного выражения: <br><br>  $req->param( foo => qr/\d+/ );<br><br>См. тж. perl -T <br><br>В качестве альтернативы есть самовалидирующиеся формы на базе Validator::LIVR или самописного каличного движка (но ЛИВР лучше).<br><br>См. тж. <a href="https://metacpan.org/pod/Validator::LIVR" target="_blank">https://metacpan.org/pod/Valid<wbr>ator::LIVR</a> и <a href="https://metacpan.org/pod/Data::CGIForm" target="_blank">https://metacpan.org/pod/Data:<wbr>:CGIForm</a><br><br>4. Хэндлер может вернуть ссылку на хэш с какими угодно параметрами, которая затем передаётся в шаблонизатор для рендеринга. На данный момент поддерживается Template::Toolkit и JSON/JSONP<br><br>Также есть ограниченный набор ключей с минусом, которые используются для управления самим фреймворком - -template, -status и т.п<br><br>5. Хэндлер может выбросить исключение: die 404 - легальный способ вернуть настраиваемую страницу not found. Все нормальные исключения (не трёхцифренные и не специальные объекты самого Neaf) трактуются как error 500.<br><br>6. Один и тот же код может в неизменном виде запускаться как cgi, psgi и под Apache2 + mod_perl (с некоторым бубном). Также поддерживается дебаг из командной строки:<br><br>   perl <a href="http://myapp.pl" target="_blank">myapp.pl</a> --help<br>   perl <a href="http://myapp.pl" target="_blank">myapp.pl</a> --list<br><br>7. Кроме этого есть поддержка статических страниц (не надо держать отдельно нормальный веб-сервер, чтобы проверить CSS или логотип), сессий в несколько недоделанном виде (планируется улучшение), отложенные действия, выполняемые после запроса, ну и по мелочи ещё.<br><br>Пример кода:<br><br>    use strict;<br>    use warnings;<br>    use MVC::Neaf;<br><br>    MVC::Neaf->route( "/" => sub {<br>        my $req = shift;<br><br>        return {<br>            -template => \'Hello, [% name %]!',<br>            -type     => 'text/plain',<br>            name      => $req->param( name => qr/\w+/, "Stranger" ),<br>        },<br>    });<br><br>На каждую фичу есть небольшой пример, они же используются как дополнительные смоук-тесты к 80% покрытию юнит-тестами. см. <a href="https://github.com/dallaylaen/perl-mvc-neaf/tree/master/example" target="_blank">https://github.com/dallaylaen/<wbr>perl-mvc-neaf/tree/master/exam<wbr>ple</a><br><br>Собственно фреймворк:<br><br><a href="https://metacpan.org/pod/MVC::Neaf" target="_blank">https://metacpan.org/pod/MVC::<wbr>Neaf</a><br><br>Буду рад обратной связи, критике, багрепортам и запросам новых фич (см. тж. <a href="https://github.com/dallaylaen/perl-mvc-neaf/blob/master/TODO" target="_blank">https://github.com/dallaylaen/<wbr>perl-mvc-neaf/blob/master/TODO</a> )<br><br>С уважением,<span class="m_-8423858727687299633m_6758391489167831187HOEnZb"><font color="#888888"><br><br></font></span></div><span class="m_-8423858727687299633m_6758391489167831187HOEnZb"><font color="#888888">-- <br><div class="m_-8423858727687299633m_6758391489167831187m_-1442192825009902413gmail_signature"><div dir="ltr"><div><div><div><font face="monospace,monospace">Konstantin S. Uvarin<br></font></div><font face="monospace,monospace">jabber: see <from><br></font></div><font face="monospace,monospace">skype: kuvarin<br></font></div><font face="monospace,monospace"><a href="http://github.com/dallaylaen" target="_blank">http://github.com/dallaylaen</a><br></font></div></div>
</font></span></div>
<br></div></div><span class="m_-8423858727687299633HOEnZb"><font color="#888888">--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" rel="noreferrer" target="_blank">http://moscow.pm.org</a><br>
<br></font></span></blockquote></div><br></div>
</blockquote></div></div></div><div><div class="h5"><br><br clear="all"><br>-- <br><div class="m_-8423858727687299633gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div><div><font face="monospace,monospace">Konstantin S. Uvarin<br></font></div><font face="monospace,monospace">jabber: see <from><br></font></div><font face="monospace,monospace">skype: kuvarin<br></font></div><font face="monospace,monospace"><a href="http://github.com/dallaylaen" target="_blank">http://github.com/dallaylaen</a><br></font></div></div>
</div></div></div>
</blockquote></div><br></div>