The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
=begin pod
=CHAPTER WebDAO - платформа для web приложений

B<WebDAO> - объектно-ориентированная система для создания  производительных web приложений, состоящая из набора модулей на языке I<perl>.

=head2 Основные принципы 

=item *  Абстракция среды выполнения кода приложения

=item *  Динамическая структура доменной логики

=item *  Адресация объектов по URL

=item *  Встроенная поддержка сессионных параметров

=head3  Абстракция среды выполнения кода приложения

Существует большое количество окружений, в которых работают  web приложений. 

    ---------------------------------------------
    |           mod_perl             Apache     |
    | FastCGI                       CGI         |
    |           ------------------------        |
    |     nginx |                      |        |
    |           |      Your code       | isapi  |
    |           |                      |        |
    |            ----------------------         |
    |  Shell            Test::More      IIS     |
    |        lighttpd                           |
    ---------------------------------------------

B<WebDAO>  проектировалась с целью избавить разработчика от деталей среды работы приложения, снизить затраты при смене окружения, а также упростить отладку и тестирование приложений. Важной целью является упрощение и повышение скорости web разработки.

=head3 Динамическая структура доменной логики

Структура объектов доменной логики формируется на основе I<XML>(I<HTML>) файла. Имя файла может быть производным. Для примера, его имя пусть будет привычным для web разработчиков : I<index.xhtml>. 

  <body>
  <div>
   <wd>
     <object class="MyTest" id="page"/>
   </wd>
  </div>
  </body>

В этом тексте, кроме XHML тэгов, используются дополнительные, например: I<wd> и I<object>. Тэг I<wd> является признаком начала специальной ( I<интерпретируемой>) области.
Пока отсутствует поддержка пространств XML имен, но со временем, я обещаю, она появится.

Тэги I<wd> обрамляют область, в которой располагаются определения объектов и другие интерпретируемые тэги.  В приведенном примере, с помощью I<command> создается экземпляр класса I<MyTest>  и идентификатором I<page>. Именно идентификатор объекта используется в URL. Например:

    http://example.org/page
    http://example.org/page/Method?par1=1&par2=2

В состав пакета I<WebDAO> входит лексический анализатор, который обрабатывает этот файл и на основе I<xml> тэгов строит структуру объектов.

Создадим файл C<MyTest.pm> со следующим содержимым:

    package MyTest;
    use WebDAO;
    use base 'WebDAO::Component';
    
    sub fetch {
        "Hello Web X.0!";
    }
    1;

Каждый из объектов доменной структуры, участвующих в формировании результатов, отображает себя сам. Поэтому, в приведенном примере, результирующий XHTML будет выглядеть следующим образом:

    <body>
    <div>
       Hello Web X.0!
    </div>
    </body>

=head3 Адресация объектов по URL

Одна из основных идей I<WebDAO> -  отображение URL на доменную структуру объектов.

Например, для адреса:

    http:://example.com/test/Method?param=1&param2

Будет вызван метод I<Method> у объекта I<test>. Имена публичных методов, которые доступны для обращений из-вне начинаются с большой буквы. Имена объектов с любой. В случае, если имя метода не указано используется I<index_x>. Если этот метод отсутствует у объекта, возвращается статус "404: Not found". Таким образом адреса:

    http:://example.com/test/?param=1&param2
    http:://example.com/test/

Эквивалентны вызовам

    http:://example.com/test/index_x?param=1&param2
    http:://example.com/test/index_x


=head3 Встроенная поддержка сессионных параметров

В I<WebDAO> встроена поддержка сессионных параметров. Схематически ее можно представить следующей диаграммой объектов:

      +-----------------+      load    +------------------+   Storages:
      |                 | <----------  |                  | -> MLDBM files
      | Session object  |     store    | WebDAO::Store::* | -> Storable files 
      |                 | ---------->  |                  | -> MemCached,MemCacheDB
      +-----------------+              +------------------+ -> Custom storage ...
          ^          |
         /|\         |
          |          |
          |         \|/
          |          V
      +-----------------+
      |                 |
      |  WebDAO::Engine |
      |                 |
      +-----------------+

Для этого достаточно выбрать источник хранения в конфигурации web сервера и указать атрибуты объекта в наследуемом классе. 

Пример конфигурации (I<Apache> web server):

    <VirtualHost *>
        ...
        #set Storable storage
        SetEnv wdStore WebDAO::Store::Storable
        #path for store
        SetEnv wdStorePar path=/tmp/sessions

        #Track session via cookies
        SetEnv wdSession WebDAO::Sessionco
        ...
    </VirtualHost>


В тексте модуля также необходимо создать атрибуты:

    package MySess;
    use WebDAO::Component;
    use base 'WebDAO::Component';
    
    # Определение  сессионных атрибутов и 
    # их значений по умалчанию
         
    __PACKAGE__->mk_sess_attr( attr1 => undef, _attr2 => undef );
    
    sub UseAttr {
        my $self = shift;
        # read
        my $val = $self->attr1;
        ...
        $self->attr1('test_value');
    }

=end pod