Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Шаблон mod_perl2 модуля


Автор: ginnie 7.1.2008, 18:10
Привожу шаблон модуля для mod_perl2, который я обычно использую в web-проектах. Модуль обрабатывает запросы вида http://www.mysite.ru/module/function.html

Код

package Module;

use strict;
use warnings;
no warnings qw(redefine);

use Apache2::Reload;
use locale;
use POSIX qw (locale_h);
setlocale(LC_CTYPE, q{ru_RU.cp1251});

use Apache::DBI; # работа с СУБД
use CGI qw{:cgi}; # получение параметров, выдача ответа
use HTML::Template; # шаблоны страниц
use Apache2::Const -compile => qw(OK);
use Apache2::Log;
use Data::Dumper; # анализ объектов
use Test::Timestamp; # оценка быстродействия по времени выполнения
use Exceptions; # собственные классы исключений на основе Exception::Class

use vars q{$VERSION};
$VERSION = q{1.00};

sub handler {
    my $timer = Test::Timestamp->new( uncorrected => 1, );
    my $r = shift;
    my %functions = (
        index   => *_default{CODE},
    );
    my %template_params = (
        cache               => 1, # включаем кэш в памяти
        cache_debug         => 0, # выключаем отладочный журнал
        die_on_bad_params   => 0, # разрешаем работу с неопределенными в шаблоне параметрами
        path                => $ENV{MODULE_TEMPLATES}, # путь к файлам шаблонов (из конфига Apache)
    );
    my $cgi = new CGI;
    $timer->stamp( q{CGI} );
    my $function_name = $cgi->url( -path_info => 1 ) =~ m{([a-z]+)\.html$}o ? $1 : q{index};
    my $script_name = $ENV{SCRIPT_NAME};
    eval {
        unless (exists $functions{$function_name}) {
            Exception::Functions::Undefined->throw( error => sprintf( q{undefined function name: %s}, $function_name ) );
        }
        $functions{$function_name}->(
            cgi                 => $cgi,
            template_params     => \%template_params,
            timer               => $timer,
        );
    };
    my $exception;
    if ( $exception = Exception::Class->caught() ) {
        _error_page(
            cgi                 => $cgi,
            template_params     => \%template_params,
        );
        if ( ref $exception ) {
            $r->log_error( sprintf( q{[exception] %s (%s:%s)}, $exception->error(), $exception->package(), $exception->line() ) );
        }
        else {
            $r->log_error( sprintf( q{[exception] %s}, $exception ) );
        }
    }
    return Apache2::Const::OK;
}
sub _error_page() {
    ...
}
sub _default() {
    ...
}

1;



Класс Exceptions
Код

package Exceptions;

use Exception::Class (
    q{Exception::Functions::Undefined}  => { description => q{used undefined function}, },
    q{Exception::Unknown}  => { description => q{some general error in the code}, },
);

1;

Автор: nitr 8.1.2008, 03:56
Т.е. можно сказать, что для любого нового "приложения" mod_perl2 можно использовать данный шаблон?

Автор: ginnie 8.1.2008, 11:58
Уважаемый nitr, приведенный шаблон можно взять за основу, когда ничего другого в голову не приходит  smile
Это шаблон модуля, который используется как PerlResponseHandler.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)