扶凯

取势 明道 优术

Catalyst 框架学习 3,826 views

作者为 扶 凯 发表

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'}});

 

 

来了就留个评论吧! 4个评论



    Simon 2010年09月9日 的 19:03

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

    斯文牛氓 2011年07月22日 的 03:05

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

      admin 2011年07月22日 的 09:45

      所以才使用 Dancer 啊

    Dancer 2011年09月1日 的 10:59

    灵活而简洁