Могу ли я заставить один модуль Perl действовать как несколько видов обработчиков mod_perl?

Я пишу серию связанных обработчиков mod_perl для различных функций, связанных с входом в систему в Apache, поэтому мой файл конфигурации Apache выглядит так (например)

PerlAccessHandler MyApache::MyAccess    
PerlAuthenHandler MyApache::MyAuthen
PerlAuthzHandler MyApache::MyAuthz

Каждый из модулей (MyAccess, MyAuthen, MyAuthz) определяет

sub handler() {}

Который mod_perl вызывает в соответствующий момент обработки запроса.

Что я хотел бы знать, так это то, есть ли способ сделать это с одним модулем Perl, а не с тремя (для пользователей проще и проще установить один модуль вместо трех)?

Возможно, есть способ определить имя метода обработчика. Или есть способ определить изнутри кода handler(), какую обработку я должен выполнять?


person AndrewR    schedule 12.02.2009    source источник


Ответы (2)


Из mod_perl 2.0 видно, что вы можете использовать синтаксис "метода", чтобы делать то, что вы хотите (я не тестировал это):

PerlAccessHandler MyApache::MyLoginModule->access_handler
PerlAuthenHandler  MyApache::MyLoginModule->authen_handler
PerlAuthzHandler MyApache::MyLoginModule->authz_handler

Я полагаю, что это заставит mod_perl вызывать каждый из именованных методов статическим образом в вашем классе MyApache::MyLoginModule.

Вы также можете создать объект, который будет использоваться при вызове метода handler, если вы хотите:

<Perl>
  use MyApache::MyLoginModule;
  $MyApache::MyLoginModule::access = MyApache::MyLoginModule->new(phase => 'access');
  $MyApache::MyLoginModule::authen = MyApache::MyLoginModule->new(phase => 'authen');
  $MyApache::MyLoginModule::authz = MyApache::MyLoginModule->new(phase => 'authz');
</Perl>

PerlAccessHandler $MyApache::MyLoginModule::access->handler
PerlAuthenHandler $MyApache::MyLoginModule::authen->handler
PerlAuthzHandler $MyApache::MyLoginModule::authz->handler

Этот подход позволит вам иметь один метод handler, который может иметь различное поведение в зависимости от свойств объекта, установленных при создании объекта.

Отказ от ответственности: я давно не работал с этой частью конфигурации mod_perl, поэтому ваши результаты могут отличаться!

person Brian Phillips    schedule 12.02.2009
comment
Использование синтаксиса ...›access_handler работает. Интересно, что обработчик получает два аргумента (второй из которых является объектом запроса), в отличие от функции handler(), которая получает только запрос. - person AndrewR; 16.02.2009
comment
Поведение с двумя аргументами описано в ссылке вверху моего ответа. - person Brian Phillips; 16.02.2009

Похоже, что одной из возможностей может быть использование вызова push_handlers() и настройка обработчиков в коде, а не в файле конфигурации apache.

См. здесь: http://tinyurl.com/bwdeew

person AndrewR    schedule 12.02.2009