Частичный перевод CGI::Application / Methods to possibly override . Третья из четырех частей перевода. Остальные будут опубликованы позднее. Примеры кода - авторские.
При желании, Вы можете произвести замещение перечисленных методов родительского класса своими собственными. Это расширит Ваши возможности в использовании и конфигурировании CGI::Application.
Почти всегда перезаписывается метод setup(). Все остальные методы - замещаются достаточно редко.
Если заглянуть в исходный код модуля Application.pm, можно заметить, что родительские методы teardown(), cgiapp_init(), cgiapp_prerun() и cgiapp_postrun() определены, вызываются в нужный момент, но никакой работы не выполняют:
|
1 2 3 4 5 6 7 8 9 |
Application.pm: ... sub cgiapp_prerun { my $c = shift; my $rm = shift; # Nothing to prerun, yet! } ... |
Эти методы предназначены именно для удобства разработчиков.
setup()
Этот метод вызывается методом new() автоматически. Метод setup() используется для задания конфигурации приложения.
В рамках setup() возможен вызов специальных методов:
- mode_param();
- start_mode();
- error_mode();
- run_modes();
- tmpl_path().
Чаще всего, setup() используется только для того, чтобы задать список всех возможных режимов работы приложения и определить режим, который будет запускаться по-умолчанию.
Пример:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
sub setup { my $self = shift; $self->mode_param('step'); $self->start_mode('on_start'); $self->run_modes( on_get_result => 'on_get_result', on_start => 'start', AUTOLOAD => sub { return 'Запрошенной страницы не существует' } ); } |
teardown()
Метод вызывается после выполнения обработчиков режимов приложения.
|
1 2 3 4 5 |
sub teardown { my $self = shift; print STDERR Dumper($self)."\n\n"; } |
cgiapp_init()
|
1 2 3 4 5 |
sub cgiapp_init { my $self = shift; $self->dbh_config('DBI:mysql:database=db2;host=localhost', 'user', 'pass'); } |
Метод cgiapp_init() вызывается на выполнение перед вызовом метода setup(). Метод получает в свое распоряжение все параметры, которые были переданы методу new().
cgiapp_prerun()
Метод cgiapp_prerun() вызывается перед запуском одного из режимов работы (run mode) приложения.
|
1 2 3 4 |
sub cgiapp_prerun { my $self = shift; $self->tt_params(block => 'show_form'); } |
Метод cgiapp_prerun() получает на вход те же данные, которые передаются затем обработчикам режимов. Cgiapp_prerun() вызывается только, если определен в коде.
cgiapp_postrun()
Метод cgiapp_postrun() вызывается на выполнение после
того, как будут выполнены обработчики режимов, но до того, как начнут формироваться HTTP-заголовки.
Cgiapp_postrun() вызывается только, если определен в коде приложения.
Метод удобен, если требуется дополнительно обработать возвращаемые данные (например, при работе с шаблонизаторами) или внести изменения в HTTP-заголовки (например, организовать переадресацию).
На вход cgiapp_postrun() получает ссылку на объект CGI::Application и ссылку на возвращенные обработчиком режима данные.
|
1 2 3 4 5 6 7 8 9 |
use Data::Dumper; ... sub cgiapp_postrun { my $self = shift; my $output_ref = shift; print STDERR Dumper($output_ref); } ... |
cgiapp_get_query()
Стандартный способ получения переданных клиентом параметров - это использование метода query() модуля CGI.pm.
Замещение метода cgiapp_get_query() позволяет использовать для получения параметров иные способы, например, с помощью модуля CGI::Simple или, если у Вы работаете с mod_perl, CGI::Application::Plugin::Apache.
Главное, чтобы соблюдалась некоторая совместимость с API CGI.pm, в частности, с методом param() CGI.pm.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
use CGI::Simple; sub cgiapp_get_query { my $self = shift; return CGI::Simple->new(); } sub on_start { my $self = shift; my $q = $self->query(); my $login = $q->param("login"); ... } |