Catalyst 是对最近颇为流行的 MVC 模型或者说是 Ruby on rails 在 Perl 上的实现。在我看来,Perl 其实功能啥都不缺,就缺一组合。而 Catalyst 就是一个快速 Web 开发的漂亮组合拳。
M - Model, 一般用来将数据库对象化,这样能比较容易访问和操作。Perl 中最有名的就是 Class::DBI
V - View, 就是视图,用来处理界面显示。Perl 中比较有名的是 Template-Toolkit 和 Mason
C - Controller, 就是控制器。就是针对不同的 action 或 request, 来执行不同的代码。另外有个名词就是分发/Dispatch
Catalyst 中可以使用很多不同的 Model 和 View/Template. 看个人喜好而定,我一般偏向于使用最流行的 CDBI 和 TT.
Class::DBI 和 TT 本来在 Perl 世界中就很出名。而按一般逻辑思维,视图与模型搞定后就剩下事件处理了。Catalyst 无缝地整合了这两者,而事件处理/Controller 则让我赞不绝口。
首先从目录结构上来说(运行 catalyst MyApp),略过某些东西:
sub view : Regexp('^tag/(.*)') { # 这个对应类如 :3000/tag/Catalyst 这样的 URL
sub orderby : Local { # 这个对应 :3000/list/orderby 这样的 URL
与 Global 不同的是它在 URL 中多了个模块名
一般而言,把简单的 \V 和 \M 搞完后(真的很简单,里面一般一个文件十行代码就可以),剩下来的就是 Controller 的编写了。
Controller 一般子程序的第一行是 my ( $self, $c ) = @_;
这里就是引进了一个最重要的 $c, 其实你不必理会它是什么东西(其实是模块的一个实例),只需要知道项目里的所有东西你都可以从这得到。需要什么,找它就是。它又分为很多部件,包括 request, response, stash, config, forward 等。
request 包含你请求(浏览器对服务器的请求)时的所有信息。如 cookies, 参数/params 和其他头/header 信息。可以通过 my $value = $c->req->params->{'foo'}; 当你访问 :3000/?foo=bar 时, $value 就是 bar 了。
response 就是服务器对浏览器的反馈。你对浏览器的输出等就是靠这个部件来解决。$c->res->output('Congratulations, NewApp is on Catalyst!'); 一般很少用 output, 因为输出一般用 Template 解决。
config 一般存储项目的配置文件。我一般用 YAML 来配置,然后通过 YAML::LoadFile 来导入该配置文件
forward 这个是很有用的东西。一般用来实现在子程序间的跳转。
stash 所有子程序传递到 TT 模块中的变量都是用这个变量来传递。(用过 TT 的人都应该知道的)
代码片断package Eplanet::C::Add;use base 'Catalyst::Base';
sub add : Global {
my ( $self, $c ) = @_;
$c->stash->{cates} = [ Eplanet::M::CDBI::Category->retrieve_all ];
}
学习流程一般这样:
* 看 Catalyst::Manual::Intro
* svn co 里看那文件夹里的 examples
* 订阅
* 写代码,做试验,问问题