我使用的Apache和Perl(modperl来),与处理程序来处理请求。 我是新来这个,我不太清楚如何打好东西出来一个明智的方式。
现在,我有以下几点:
package MyClass::Handler;
use warnings;
use strict;
# includes
our %action = (
'a' => \&a,
# And more
);
sub handler {
my $a = shift;
my $r = Apache2::Request->new($a);
# Do things
return Apache2::Const::OK();
}
我应该为每个“空间”不同的文件? 使用计算器为模板,我需要为所有的用户管理User.pm? 一种故事Story.pm?
你可能会感兴趣的优秀CGI ::应用从CPAN框架。 尽管它的名字,它的工作原理都在正常CGI和mod_perl的。 它的设计,使建立web应用分派表很简单的任务。 在投掷CGI ::应用::派遣 ,你会得到很好的REST样的URL。
对于最近的一个项目,我写了这实现了一个新的ResourceURI配置设置自定义配置处理程序。 这让我把配置行到httpd.conf中是这样的:
ResourceURI SomeResource GET,POST,DELETE "^/...$"
这三个参数是我的资源类的名字,它的资源可以响应HTTP方法列表,并为资源相匹配的URI(S)一个正则表达式。
自定义配置类替换每个这些行与这样的块的:
PerlModule Handler::{resource class}
PerlModule Resource::{resource class}
<Location ~ "{uri regex}">
Order allow,deny
Allow from all
<LimitExcept {allowed methods}>
Order deny,allow
Deny from all
</LimitExcept>
SetHandler modperl
PerlHandler Handler
PerlSetVar Resource {resource class}
</Location>
这需要加载我的课的护理,让阿帕奇拒绝无效的方法,设置标志,以表明其资源路线,并通过我的处理程序::处理器()函数的所有请求。
package Handler;
sub handler {
my $r = shift;
my $resource_class = 'Resource::' . $r->dir_config('Resource');
my $handler_class = 'Handler::' . $r->dir_config('Resource');
my $resource = $resource_class->new($r, $r->uri);
return Apache2::Const::HTTP_NOT_FOUND unless $resource;
my $method = $r->method();
return Apache2::Const::HTTP_NOT_IMPLEMENTED
unless $handler_class->can($method);
return $handler_class->$method($r, $resource);
}
现在,你只需要实现资源:: *类与资源的逻辑(包括如何格式化表示),处理器:: *类与方法命名为GET,HEAD,POST等,并让他们使用$ R $和资源来处理请求。
对于需要每一个新的资源,您添加配置的一条线,实现一个Handler类(其中我发现往往是一个几乎空模块从通用基类继承),并实现其包含大量的一个资源类码。 我还发现,我经常需要创建在处理另一个资源的请求上下文一个资源对象; 这就是为什么我的资源建设者采取的URI一个单独的参数,而不是刚刚从$ R的URI。 如果我在资源:: Foo和我需要一个资源:: Bar对象,我可以说我的$栏=资源::酒吧,>新($ R,“/酒吧/ 1234”); 它创建使用相同的URI,一个客户端将使用Bar对象。