Catalyst 简单入门
取自 PerlChina.org - wiki
- 翻 译: cnhacktnt
- 出 处:中国 Perl 协会 FPC - PerlChina.org
- 原 名: Catalyst Intro
- 中 文:Catalyst 简单入门
- 原 文:http://search.cpan.org/perldoc?Catalyst::Manual::Intro
- 发 表:2005-10-12
- Perlchina 提醒您:请保护作者的著作权,维护作者劳动的结晶。
目录 |
[编辑] 名称
Catalyst 指南 - Catalyst 简单入门
[编辑] 描述
这份文档的目的是让你能对 Catalyst 有初步的了解,并能创建可运行的基于 Catalyst 的程序。
注意: 这份文档还是一份尚未完成的草稿,详情请看文档后的说明。
[编辑] 安装
首先你要安装好 Catalyst, 一条捷径就是使用 CPAN 来安装捆绑好了的 Catalyst 模块集:
$ perl -MCPAN -e 'install Bundle::Catalyst'
上面这条命令就可以从 CPAN 获取 Catalyst 和很多有用的扩展模块并为你安装好它们。
[编辑] 建立你的应用程序
Catalyst 包含一个辅助脚本, catalyst.pl, 这个脚本可以为你生成一个应用程序框架:
created "My-App"
created "My-App/script"
created "My-App/lib"
created "My-App/root"
created "My-App/t"
created "My-App/t/m"
created "My-App/t/v"
created "My-App/t/c"
created "My-App/lib/My/App"
created "My-App/lib/My/App/M"
created "My-App/lib/My/App/V"
created "My-App/lib/My/App/C"
created "My-App/lib/My/App.pm"
created "My-App/Build.PL"
created "My-App/Makefile.PL"
created "My-App/README"
created "My-App/Changes"
created "My-App/t/01app.t"
created "My-App/t/02pod.t"
created "My-App/t/03podcoverage.t"
created "My-App/script/my_app_cgi.pl"
created "My-App/script/my_app_fastcgi.pl"
created "My-App/script/my_app_server.pl"
created "My-App/script/my_app_test.pl"
created "My-App/script/my_app_create.pl"
这个脚本会创建如上所示的目录结构, 包含一些框架文件。
[编辑] 测试示例程序
你可以利用 Catalyst 提供的服务器脚本来测试你的应用程序:
$ cd My-App
$ script/my_app_server.pl
[...] [catalyst] [debug] Debug messages enabled
[...] [catalyst] [debug] Loaded dispatcher "Catalyst::Dispatcher"
[...] [catalyst] [debug] Loaded engine "Catalyst::Engine::HTTP"
[...] [catalyst] [debug] Found home "/usr/home/jester/foo/My-App/script/.."
[...] [catalyst] [debug] Loaded private actions
.=--------------------------------+------------------------------------=.
| Private | Class |
|=--------------------------------+------------------------------------=|
| /default | My::App |
'=--------------------------------+------------------------------------='
[....] [catalyst] [info] My::App powered by Catalyst 5.20
现在你可以通过 http://localhost:3000/ 来访问 catalyst 服务器了。
(注意,上面 Cataylst 的每条日志记录都是以一个时间标记开始的,这里用 ``... 代替)
现在服务器在等待你给他一个请求了,你可以试试用 telnet 连上它,然后手工发送一条简单的 GET 请求。(当 telnet 返回 ``Escape character is '^]'. 后,输入 ``GET / HTTP/1.0 并两次回车。):
$ telnet localhost 3000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.0
HTTP/1.0 200
Server: Catalyst/5.20
Status: 200
Date: Fri May 13 14:15:46 EDT 2005
X-catalyst: 5.20
Content-length: 40
Content-Type: text/html; charset=ISO-8859-1
Congratulations, My::App is on Catalyst!
Connection closed by foreign host.
$
在你运行 catalyst 服务器脚本的那个终端窗口中会有详细的记录:
[...] [catalyst] [debug] ******************************** [...] [catalyst] [debug] * Request 1 (0.027/s) [9818] [...] [catalyst] [debug] ******************************** [...] [catalyst] [debug] "GET" request for "" from localhost [...] [catalyst] [info] Request took 0.051399s (19.456/s) .=--------------------------------------------------+----------=. | Action | Time | |=--------------------------------------------------+----------=| | /default | 0.000026s | '=--------------------------------------------------+----------='
这个服务器会一直运行,除非你主动将它中止。
另外,也可以用先前自动生成的辅助脚本来测试你的应用程序,script/my_app_test.pl.
[编辑] 让你的应用程序实际工作起来
Catalyst 应用程序一般在 mod_perl 环境下运行,但也可以以 CGI 或者 FastCGI 脚本的方式运行。在 mod_perl 下运行的话会获得更好的性能,但是考虑到某些开发方面的目的,你也许想以 CGI 脚本的方式运行你的程序,尤其是当你想让修改后的程序代码立即生效而不需要重新启动 Web 服务器的时候。
要想以 mod_perl 方式运行你的程序,需要在你的 Apache 配置文件中加上:
<Location /my-app>
SetHandler perl-script
PerlHandler My::App
</Location>
想以 CGI 方式运行的话:
#!/usr/bin/perl -w
use strict;
use lib '/path/to/My/App/lib';
use My::App;
My::App->run;
[编辑] 考查生成的代码
前面自动生成的代码非常简单,内容看起来像这样:
package My::App;
use strict;
use Catalyst qw/-Debug/;
our $VERSION = '0.01';
My::App->config(
name => 'My::App',
root => '/home/andrew/My-App/root',
);
__PACKAGE__->setup();
sub default : Private {
my ( $self, $c ) = @_;
$c->res->output('Congratulations, My::App is on Catalyst!');
}
1;
一旦 Catalyst 这个模块被应用程序加载,那么它就进入了第一个阶段---初始化。此阶段它会加载与正在运行的这个应用程序的环境相应的引擎模块,插件,并确保被调用的模块(应用程序模块)继承自 Catalyst (这样你就可以在你的应用程序模块中使用 Catalyst 的 config 和 setup 方法。) config 方法用来设定一些关于这个应用程序的配置信息。它其中至少要包含 name 和 root 两项,这两项依次指定了应用程序的名字,应用程序的根目录(即 root 目录,这里面可能包含一些文档,图片,模板等程序可能要用到的资源)
Catalyst 的 actions(行为) 是与 URL 相关联的, action 与 URL 请求是相匹配的。前面所示的代码中的 setup 方法会注册一个默认的 action(default)。由于只注册了这个默认的 action,所以对于当前所有的请求,都只会返回一句 ``Congratulations, My::App is on Catalyst!。
如你所见,这个 default action 被定义为一个私有的(Private)action。大多数的私有 action 对于 web url 请求都不是直接可见的。另外,尽管内建的 'default','begin,'end','auto' 可以对某些链接请求做出响应,但他们也属于私有 action,除了这几个,其他的私有 action 都得用 forward 方法来间接访问。
setup 方法将触发 Catalyst 初始化进程的第二阶段。这期间 Catalyst 会相应的搜索所有的组件模块,查找并注册所有从这些模块中发现的 action。
组件模块以应用程序的模块名称作为前缀,紧跟着是 M, V 或 C(你也可以用全称: Model, View 或 Controller ),举个例子:
My::App::C::ShoppingCart # 短模块名 (默认)
My::App::Controller::ShoppingCart # 长模块名
My::App::M::User # 短模块名 (默认)
My::App::Model::User # 长模块名
[编辑] 扩充自动生成的代码
你可以添加新的 action 来扩充自动生成的代码:
sub test1 : Global {
my ( $self, $c ) = @_;
$c->res->output('In a new test action #1');
}
sub default : Private {
my ( $self, $c ) = @_;
$c->res->output('Congratulations, My::App is on Catalyst!');
}
# 请求的 URL 像这样 '/article/2005/06'
sub archive_month : Regex('^article/(\d{4})/(\d{2})$') {
my ( $self, $c ) = @_;
my $datetime = DateTime->new(
year => $c->request->snippets->[0],
month => $c->request->snippets->[1]
);
}
TODO: explain briefly about plugins, actions, and components 如果 action 的类型是 Regex,那么你可以用正则表达式中的圆括号将相匹配的 URL 中的值取出来(上面的例子中,取出的值就是 2005,06),这些值保存在匿名数组 $c->req->snippets 中,详情请参看 Catalyst::Manual::Intro#Actions
[编辑] 结合 Template Toolkit
大概为你的应用程序添加一个模板系统来生成输出是一件首要的事,而 Catalyst 可以和 Template Toolkit 很好的工作。假如你对 Template Toolkit 不太熟悉,那我建议你看看 http://tt2.org,然后安装一个 Template 模块,看看它的文档,再多加练习,另外再看看 Badger Book (即《Template Toolkit》,Darren Chamberlain, Dave Cross, 和 Andy Wardley 所编著, O'Reilly & Associates 2004出版)
你可以用一个创建脚本(包含在建立 Catalyst 程序时自动生成的框架文件中)来生成一个简短的 Template Toolkit 视图组件:
$ script/create.pl view TT TT
上面的命令建立了一个名为 My::App::V::TT 的视图组件,你可以在你的 end action 中将要输出的内容转发给该模块来进行渲染输出。
# In My::App or My::App::Controller::SomeController
sub end : Private {
my($self, $c) = @_;
$c->forward('My::App::V::TT');
}
生成的视图组件 TT 是 Catalyst::View::TT 的一个简单子类。它的内容看起来像这样:
package My::App::V::TT;
use strict;
use base 'Catalyst::View::TT';
1;
Catalyst::View::TT 会初始化一个 Template Toolkit 对象,这个对象的散列参数是由内建的默认设置再参照散列<%{__PACKAGE__-config()}>> 的内容来初始化的。你可以按需在生成的 TT 组件中添加 new 方法来对 TT 做更多的配置:
sub new {
my $self = shift;
$self->config->{PRE_PROCESS} = 'config/main';
$self->config->{WRAPPER} = 'site/wrapper';
return $self->SUPER::new(@_);
}
[编辑] 作者
Andrew Ford, A.Ford@ford-mason.co.uk Marcus Ramberg, mramberg@cpan.org
开头已经注明,这份文档只是最初版本。我对这份文档的计划如下:
- 对文档进行迅速清晰的扩充,覆盖与 Catalyst 新手相关的主题并让他们可以循序渐进的进行阅读。
- 结合反馈信息
- 修订内容
将要扩充的地方会以 TODO 或 CHECK 作为占位符进行标注
请将您的评论,校正和建议发送到 A.Ford@ford-mason.co.uk 以便提升文档质量
[编辑] 版权声明
这份文档属于自由软件, 你可以在 Perl 许可的条款下对其进行分发或者修改。 $ Date: 2005/10/12 17:05 $ $ Original document come with Catalyst-5.33 $
