查看完整版本: Catalyst 简单入门

宙斯 2006-5-25 22:49

Catalyst 简单入门

[code]名称
描述
安装
建立你的应用程序
测试示例程序
让你的应用程序实际工作起来
考查自动生成的代码
扩充自动生成的代码
结合 Template Toolkit
作者
版权声明

--------------------------------------------------------------------------------


名字
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
翻译:cnhackTNT, cnhackTNT at perlchina.org

开头已经注明,这份文档只是最初版本。我对这份文档的计划如下:

对文档进行迅速清晰的扩充,覆盖与 Catalyst 新手相关的主题并让他们可以循序渐进的进行阅读。

结合反馈信息

修订内容

将要扩充的地方会以 TODO 或 CHECK 作为占位符进行标注

请将您的评论,校正和建议发送到 A.Ford@ford-mason.co.uk 以便提升文档质量



--------------------------------------------------------------------------------

版权声明
这份文档属于自由软件, 你可以在 Perl 许可的条款下对其进行分发或者修改。

[/code]
页: [1]
查看完整版本: Catalyst 简单入门