[Kiev-pm] [Moscow.pm] MVC::Neaf: Not Even A Framework

Akzhan Abdulin akzhan.abdulin at gmail.com
Wed Dec 7 02:26:12 PST 2016


Как уже показывал - можно подсмотреть в http://v32.rusrails.ru/
action-controller-overview/filters

Для чего это очень удобно:

Например, маршруты get one, put, patch, delete скорее всего требуют
одинакового действия - загрузки экземпляра сущности, для дальнейших
действий над ним, либо возврата HTTP::Status::HTTP_NOT_FOUND.

Пример тоже уже скидывал:

use HTTP::Status qw( HTTP_NOT_FOUND );

before_filter extract_message => sub {
    my $self = shift;
    my $message = MyModel::Message->find( $self->param('id') )
        or do {
            $self->render( json => { success => \0, error => 'Not found' },
status => HTTP_NOT_FOUND );
            return; # nok
        };
    $self->stash( message => $message );
    return 1; # ok, filter proceed successfully
};

get '/message/:id' => { filter => 'extract_message' }, sub {
    my $self = shift;
    my $message = $self->stash('message'); # We always have message here!
};

put '/template/:id' => { filter => 'extract_message' }, sub {
    my $self = shift;
    my $message = $self->stash('message'); # We always have message here!
};

delete '/template/:id' => { filter => [ 'extract_message' ] }, sub {
    my $self = shift;
    my $message = $self->stash('message'); # We always have message here!
};


6 декабря 2016 г., 17:06 пользователь Konstantin S. Uvarin <khedin at gmail.com
> написал:

> Приветствую!
>
>   Я так понял, фильтры - это хуки, которые втыкаются на определённый путь
> и все нижележащие пути? С одной стороны, руки уже чешутся написать, с
> другой, там очень легко перегнуть палку и сделать чересчур...
>
>   Но спасибо за идею.
>
> 2016-12-03 1:00 GMT+02:00 Akzhan Abdulin <akzhan.abdulin at gmail.com>:
>
>> Не хватает фильтров, как минимум (в том же Mojo они тоже туповаты, каждый
>> over перекрывает предыдущие, вместо расширения).
>>
>>
>> На досуге почитайте http://www.sinatrarb.com/intro.html
>>
>>
>> 2 декабря 2016 г., 17:39 пользователь Konstantin S. Uvarin via Moscow-pm
>> <moscow-pm at pm.org> написал:
>>
>>> Приветствую всех!
>>>
>>> Сегодня я бы хотел представить веб-фреймворк на перл 5 собственного
>>> сочинения, Ниф (Not Even A Framework). Написан он больше для
>>> самообразования, т.к. и так их как собак нерезаных, но мне кажется, в нём
>>> есть некие здравые идеи. Суть такова:
>>>
>>> 1. Приложение разбивается на маленькие процедуры-хэндлеры, привязанные к
>>> пути в URI (см. тж. https://metacpan.org/pod/Dancer )
>>>
>>> 2. Хэндлер получает на вход объект запроса, из которого потом достаются
>>> параметры, куки, заголовки и т.д. (см. тж. https://metacpan.org/pod/Kelp
>>> )
>>>
>>> 3. Параметры и куки нельзя достать без валидации, например, при помощи
>>> регулярного выражения:
>>>
>>>   $req->param( foo => qr/\d+/ );
>>>
>>> См. тж. perl -T
>>>
>>> В качестве альтернативы есть самовалидирующиеся формы на базе
>>> Validator::LIVR или самописного каличного движка (но ЛИВР лучше).
>>>
>>> См. тж. https://metacpan.org/pod/Validator::LIVR и
>>> https://metacpan.org/pod/Data::CGIForm
>>>
>>> 4. Хэндлер может вернуть ссылку на хэш с какими угодно параметрами,
>>> которая затем передаётся в шаблонизатор для рендеринга. На данный момент
>>> поддерживается Template::Toolkit и JSON/JSONP
>>>
>>> Также есть ограниченный набор ключей с минусом, которые используются для
>>> управления самим фреймворком - -template, -status и т.п
>>>
>>> 5. Хэндлер может выбросить исключение: die 404 - легальный способ
>>> вернуть настраиваемую страницу not found. Все нормальные исключения (не
>>> трёхцифренные и не специальные объекты самого Neaf) трактуются как error
>>> 500.
>>>
>>> 6. Один и тот же код может в неизменном виде запускаться как cgi, psgi и
>>> под Apache2 + mod_perl (с некоторым бубном). Также поддерживается дебаг из
>>> командной строки:
>>>
>>>    perl myapp.pl --help
>>>    perl myapp.pl --list
>>>
>>> 7. Кроме этого есть поддержка статических страниц (не надо держать
>>> отдельно нормальный веб-сервер, чтобы проверить CSS или логотип), сессий в
>>> несколько недоделанном виде (планируется улучшение), отложенные действия,
>>> выполняемые после запроса, ну и по мелочи ещё.
>>>
>>> Пример кода:
>>>
>>>     use strict;
>>>     use warnings;
>>>     use MVC::Neaf;
>>>
>>>     MVC::Neaf->route( "/" => sub {
>>>         my $req = shift;
>>>
>>>         return {
>>>             -template => \'Hello, [% name %]!',
>>>             -type     => 'text/plain',
>>>             name      => $req->param( name => qr/\w+/, "Stranger" ),
>>>         },
>>>     });
>>>
>>> На каждую фичу есть небольшой пример, они же используются как
>>> дополнительные смоук-тесты к 80% покрытию юнит-тестами. см.
>>> https://github.com/dallaylaen/perl-mvc-neaf/tree/master/example
>>>
>>> Собственно фреймворк:
>>>
>>> https://metacpan.org/pod/MVC::Neaf
>>>
>>> Буду рад обратной связи, критике, багрепортам и запросам новых фич (см.
>>> тж. https://github.com/dallaylaen/perl-mvc-neaf/blob/master/TODO )
>>>
>>> С уважением,
>>>
>>> --
>>> Konstantin S. Uvarin
>>> jabber: see <from>
>>> skype: kuvarin
>>> http://github.com/dallaylaen
>>>
>>> --
>>> Moscow.pm mailing list
>>> moscow-pm at pm.org | http://moscow.pm.org
>>>
>>>
>>
>
>
> --
> Konstantin S. Uvarin
> jabber: see <from>
> skype: kuvarin
> http://github.com/dallaylaen
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/kiev-pm/attachments/20161207/7d8f7909/attachment-0001.html>


More information about the Kiev-pm mailing list