[Perl Module] Catalyst 框架学习

May 18th, 2010

转载本站文章请注明,转载自:扶凯[http://www.php-oa.com]

本文链接: http://www.php-oa.com/2010/05/18/perl-catalyst.html

Catalyst 是一个 web 应用程序开发框架,灵活而简洁,如果对 perl 有一定的基础,上手很快.他的同类产品有 Ruby on Rail,Sprint(Java) 和 Maypole,Django(Python).

Catalyst 遵从 MVC 的设计模式,MVC 分别指 Model,View,Controller.三者相对独立又密切联系.

    • Model 主要是用来处理内容或者说数据,一般采用 Catalyst::Model::CDBI DBIx::Class::Schema 之类访问数据库,这个还包括各种用户验证方法.
    • View 是其表现形式,将内容按照模版渲染之后发送给浏览器,可以采用 Template::Toolkit,Mason,HTML::Template等.
    • Controller 处理浏览器的请求和各种参数,并将其分发到各种行为.

Model

在开发的过程中,Model 部分基本不需要编写什么代码,CPAN 上丰富的模块资源已经可以很好的满足需求,而且也更加健壮和完善,只要直接采用 Catalyst 的 Help Script 创建相应模块就可以了.在这个系统中可以使用如 Catalyst::Model::CDBI 之类,可以将数据库中的表映射成类,这样只需对类进行操作,只要会一点 sql 语法就能很好的使用这个了,都不用自己来写 Sql 语,对象会自动更新和修改数据库,其实它内部还是转换成了 sql 的语句.

DBIx::Class::Manual 的使用介绍
http://search.cpan.org/~frew/DBIx-Class-0.08121/lib/DBIx/Class/Manual.pod

View

View 部分也和 Model 一样,不用自己写很多,只要写一下页面模版,默认建议使用 Template Toolkit ,TT 的语法相当的有意思 ,耐心的看我提供的链接中几个例子就可以运用自如了.系统将用于全局共享的上下文对象$c传给 TT 的模版,通过 c.req.name 之类的语法就可以引用相应的变量,同时 $c->stash 中的变量可以直接引用,这部分里,TT的语法还是相当的容易的, c.req.name 实际上对应于$c->req->{name},大部分时间我是这样用的,用 Perl 生成一个合理的数据结构的引用,然后使用 Template Toolkit 来做数据的解引用.并显示出来,这样非常方便, Template Toolkit 提供的一些内部的虚函数相当好用,可以看.

Template Toolkit 的基本语法
http://search.cpan.org/~abw/Template-Toolkit-2.22/lib/Template/Manual/Syntax.pod
 
Template Toolkit 的虚函数:

http://search.cpan.org/~abw/Template-Toolkit-2.22/lib/Template/Manual/VMethods.pod


Controller

这部分是 Catalyst 中对各种请求的分发和处理,Catalyst 的各个行为分别匹配特定的请求.行为的属性分为 Global,Local, Path,Private,RegExp 等几类.此外,Catalyst有几个保留的行为,begin,auto,default,end.系统接到一个请求后,将按下面的顺序执行,begin->auto->{action or default}->end.auto 和 begin 的区别在于本地的 begin 会重载上层的 begin,而 auto 则是本地和上层的都会执行.一般情况下都是在end里采用$c->res->forward(TShirt::V::TT),forward会传递整个请求的参数和上下文.

Controller 是连接 Model 和 View 的,也是基本只要写这个部分的 Perl 代码就行了.其它象上面讲的,很少自己写了.建议多使用 Perl  CPAN 上的模块.因为虽然自己实现起来并不困难,但是使用现成的模块无疑让程序更加的优美和直观.自己写的部分代码看上去实在是比较丑陋,尽管功能是实现了.

 

Catalyst 需要的环境(怎么样安装)

cpanm Catalyst
cpanm Catalyst::Devel
cpanm DBIx::Class
cpanm Catalyst::Model::DBIC::Schema
cpanm Catalyst::View::TT  #Template Toolkit v2.20

注: cpanm的使用,见我这个文章,推荐使用这个来安装模块: http://www.php-oa.com/2010/05/05/perl-cpanminus-cpan.html

Catalyst 常用的插件列表

Catalyst::Plugin::Authentication
Catalyst::Plugin::Authorization::Roles
Catalyst::Plugin::ConfigLoader
Catalyst::Plugin::Session
Catalyst::Plugin::Session::State::Cookie
Catalyst::Plugin::Session::Store::FastMmap
Catalyst::Plugin::StackTrace
Catalyst::Plugin::Static::Simple  

 

Catalyst 学习中一些小技巧


(1  在 shell 中设置这个环境变量,可以显示 sql 的细节内容.方便调试

DBIC_TRACE=1  

如果你对所写的 ->search 不太确定,你可以使用 ->as_query 来 debug

(2  在建完数据库对象模型 schema 后,我们常常需要用下面这个语句来和 Catalyst 关联起来

script/myapp_create.pl model MyAppDB DBIC::Schema MyAppDB dbi:SQLite:myapp.db   '{ AutoCommit => 1 }'

其中第一个 MyAppDB 是辅助脚本将要在lib/MyApp/Model目录下创建的类的名字. 第二个 MyAppDB 是我们已经创建的数据库对象模型  schema 文件的名字(lib/MyAppDB.pm).
后面的 dbi 如果使用的是 mysql 的话,就用 dbi:mysql:数据库名:localhost 来设置,后面的   是指用户名和密码.以上设置了以后,在 Catalyst 才能调用.

(3  想不用默认的数组对数据结构的输出,使用 hash 来输出容易的话可以使用

 use DBIx::Class::ResultClass::HashRefInflator.
 my $rs = $schema->resultset('CD');
 $rs->result_class('DBIx::Class::ResultClass::HashRefInflator');
 my $hash_ref = $rs->find(1);

 

 

Catalyst FQA.

1.Couldn’t render template "file error – listspeed.tt2: not found"
 找不到模板,模板的路径设置错了

2. Couldn’t render template "undef error – Catalyst is undefined
View/TT.pm 中需要定义 

CATALYST_VAR => 'Catalyst',

3. 在 DBIx::Class 中怎么排序(desc,asc)

$rs->search({channel => $channel },{order_by => {-asc => 'time'}});

 

 

Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪 ViVi 365Key 网摘 天极网摘 和讯网摘 博拉网 POCO 网摘 饭否 QQ 书签 Digbuzz 我挖网 Mister Wong
  1. Simon
    Sep 9th, 2010 at 19:03
    Reply | Quote | #1

    I think the MVC frame used by Java should be Spring.

  2. 斯文牛氓
    Jul 22nd, 2011 at 03:05
    Reply | Quote | #2

    说实话 我真不觉得catalyst简洁。。。。

  3. admin
    Jul 22nd, 2011 at 09:45
    Reply | Quote | #3

    所以才使用 Dancer 啊

  4. Dancer
    Sep 1st, 2011 at 10:59
    Reply | Quote | #4

    灵活而简洁