我可以将一个Perl模块作为多种mod_perl处理程序吗?

时间:2009-02-12 06:33:00

标签: perl apache mod-perl

我正在为Apache中的各种与登录相关的函数编写一系列相关的mod_perl处理程序,所以我的Apache配置文件看起来像这样(例如)

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

每个模块(MyAccessMyAuthenMyAuthz)都定义了

sub handler() {}

在处理请求时,mod_perl调用相关点。

我想知道的是,是否有一种方法可以使用一个Perl模块而不是三个(对于用户来说安装一个模块而不是3个更简单,更少工作)?

是否有某种方法可以定义处理程序方法的名称。或者有没有办法从handler()代码中检测出我应该做哪种处理?

2 个答案:

答案 0 :(得分:5)

mod_perl 2.0 docs看来你可以使用“方法”语法来做你想要的事情(我没有测试过这个):

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配置的这一部分已经有一段时间了,所以你的结果可能会有所不同!

答案 1 :(得分:1)

看起来有一种可能是使用push_handlers()调用并在代码中而不是在apache conf文件中设置处理程序

见这里:http://tinyurl.com/bwdeew