Black Perl 2011

          Построение
       PSGI-совместимых
       Web-framework’ов
        Сергей Засенко (und3f)


           1 октября 2011 г.
Преимущества

   • Свобода выбора архитектуры
     приложения.
   • Возможность простроения
     асинхронного приложения на базе
     любой событийной машины.
   • Выбор зависимостей системы.
Составляющие веб-фреймворка
Составляющие веб-фреймворка

 Routes разбор адреса запроса.
 Controller контроль входящих данных
 и реализация реакции с помощью модели
 и представления.
 View отображение информации.
 Model данные и методы работы с
 ними.
Что необходимо выполнить?



   Соединить готовые
      компоненты
Модули разбора маршрутов

   • HTTP::Router
   • Path::Dispatcher
   • Path::Router
   • Route::Simple
   • Routes::Tiny
   • другие.
Шаблонизаторы

  • HTML::CTPP2
  • HTML::Template
  • Template::Toolkit
  • Text::Caml
  • Text::Xslate
  • другие.
Этапы выполнения

   1   Разбор адреса запроса и определение
       обрабатывающего контроллера.
   2   Передача управления в
       соответствующий контроллер.
   3   Обработка шаблона с параметрами
       контроллера.
Реализация



      Hello, Plack!
Инструменты реализации


   • Plack
   • Text::Caml
   • Routes::Tiny
Инициализация rout’ов

 my $routes = Routes::Tiny−>new;

 $routes−>add_route(’/’,
     defaults => {action => &root});

 $routes−>add_route(’/welcome/:name’ ,
     defaults => {action => &welcome});
Разбор URL
 sub dispatch {
     my $env = shift;

     my $path = $env−>{PATH_INFO};

     if (my $route = $routes−>match($path)) {
         my $action = $route−>{params}{action};

         $action−>($env, $route−>{params});
     }
 }
View

 sub render {
     my ($template, $data) = @_;

     my $view = Text::Caml−>new;

     my $html = $view−>render_file($template, $data);

     [200, [ ’Content−Type’, ’text/html’ ], [$html ]];
 }
Контроллеры
 sub root {
     my ($env, $params) = @_;

     render( ’ root .mt’);
 }

 sub welcome {
     my ($env, $params) = @_;

     render( ’welcome.mt’, $params);
 }
Шаблоны

                   root.mt
 <html>
  <body>Hello, Plack!</body>
 </html>

                welcome.mt
 <html>
  <body>Hello, {{name}}.</body>
 </html>
Тесты
 use FindBin ’$Bin’ ;
 my $app = require "$Bin/../app.psgi";

 test_psgi $app, sub {
     my $cb = shift;

     my $res = $cb−>(GET ’/’);
     like $res−>content, qr/Hello, Plack!/;

     $res = $cb−>(GET ’/welcome/Sergey’);
     like $res−>content, qr/Hello, Sergey ./;
 }
Итог

   • Есть набор готовых компонент для
     построения собственного
     web-framework’а.
   • Соединять компоненты легко.
   • Возможно разработать приложение
     любой конфигурации.
   • Разрабатывайте!
Исходный код



 https://github.com/und3f/black-perl-2011
Другие примеры

 JLogger::Web
 https://github.com/und3f/jlogger-web

 Lamework
 https://github.com/vti/lamework

 Web::Simple
 https://metacpan.org/module/Web::Simple
Вопросы?

Psgi app

  • 1.
    Black Perl 2011 Построение PSGI-совместимых Web-framework’ов Сергей Засенко (und3f) 1 октября 2011 г.
  • 2.
    Преимущества • Свобода выбора архитектуры приложения. • Возможность простроения асинхронного приложения на базе любой событийной машины. • Выбор зависимостей системы.
  • 3.
  • 4.
    Составляющие веб-фреймворка Routesразбор адреса запроса. Controller контроль входящих данных и реализация реакции с помощью модели и представления. View отображение информации. Model данные и методы работы с ними.
  • 5.
    Что необходимо выполнить? Соединить готовые компоненты
  • 6.
    Модули разбора маршрутов • HTTP::Router • Path::Dispatcher • Path::Router • Route::Simple • Routes::Tiny • другие.
  • 7.
    Шаблонизаторы •HTML::CTPP2 • HTML::Template • Template::Toolkit • Text::Caml • Text::Xslate • другие.
  • 8.
    Этапы выполнения 1 Разбор адреса запроса и определение обрабатывающего контроллера. 2 Передача управления в соответствующий контроллер. 3 Обработка шаблона с параметрами контроллера.
  • 9.
    Реализация Hello, Plack!
  • 10.
    Инструменты реализации • Plack • Text::Caml • Routes::Tiny
  • 11.
    Инициализация rout’ов my$routes = Routes::Tiny−>new; $routes−>add_route(’/’, defaults => {action => &root}); $routes−>add_route(’/welcome/:name’ , defaults => {action => &welcome});
  • 12.
    Разбор URL subdispatch { my $env = shift; my $path = $env−>{PATH_INFO}; if (my $route = $routes−>match($path)) { my $action = $route−>{params}{action}; $action−>($env, $route−>{params}); } }
  • 13.
    View sub render{ my ($template, $data) = @_; my $view = Text::Caml−>new; my $html = $view−>render_file($template, $data); [200, [ ’Content−Type’, ’text/html’ ], [$html ]]; }
  • 14.
    Контроллеры sub root{ my ($env, $params) = @_; render( ’ root .mt’); } sub welcome { my ($env, $params) = @_; render( ’welcome.mt’, $params); }
  • 15.
    Шаблоны root.mt <html> <body>Hello, Plack!</body> </html> welcome.mt <html> <body>Hello, {{name}}.</body> </html>
  • 16.
    Тесты use FindBin’$Bin’ ; my $app = require "$Bin/../app.psgi"; test_psgi $app, sub { my $cb = shift; my $res = $cb−>(GET ’/’); like $res−>content, qr/Hello, Plack!/; $res = $cb−>(GET ’/welcome/Sergey’); like $res−>content, qr/Hello, Sergey ./; }
  • 17.
    Итог • Есть набор готовых компонент для построения собственного web-framework’а. • Соединять компоненты легко. • Возможно разработать приложение любой конфигурации. • Разрабатывайте!
  • 18.
  • 19.
    Другие примеры JLogger::Web https://github.com/und3f/jlogger-web Lamework https://github.com/vti/lamework Web::Simple https://metacpan.org/module/Web::Simple
  • 20.