MVC::Neaf - Not Even A (Web) Framework
Тут меня некоторые попрекают, что я в 2016 году начинаю проект на perl. Вы будете смеяться, на я ещё и фреймворк под него напилил. Простенький, но, как мне кажется, не лишённый некоторых здравых идей. Суть такова:
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 или логотип), сессий (в несколько недоделанном виде, планируется улучшение), отложенные действия, выполняемые после запроса, ну и по мелочи ещё.
8. Также есть экспериментальный синтаксический сахар типа get '/foo' => sub { ... }; и экспериментальные же хуки, позволяющие воткнуться в обработку запроса за пределами хэндлера. Хуки привязаны к путям, т.е. для /foo/bar будут выполнены как «/», так и «/foo» и «/foo/bar».
Пример кода:
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
Собственно проект: