第三章 掌握Controller 第一节 简介
时间:2007-04-11 来源:xiaoshengcaicai
上 一章介绍了X.pm,也就是应用程序类, 当我们在apache+mod_perl里面把X.pm部署进去之后, 当客户端有请求过来的时候,X.pm选择某个Controller里面的某个action来处理这个请求, 这个选择的过程称为分发(dispatch), Catalatys项目刚建立的时候默认已经有了一个Controller: Root.pm.
在分析Root.pm的代码之前,我们先尝试一下在Root.pm里面添加一个名字为help的action,整个模块的代码如下:(红色部分是我们刚添加的代码)
package X::Controller::Root; |
我们在使用Catalyst进行开发的时候,如果要进行测试,看看页面效果什么的,没有 必要把项目部署到apache+mod_perl里面, 因为Catalyst为每个项目都提供了一个脚本,你可以在script/目录下看到x_server.pl,它类似于一个小型的web server, 运行这个脚本的话,它会use X.pm, 从而加载你的整个项目相关的所有插件跟组件, 而且它会在某个端口上进行监听, 当有客户端往该端口发送请求时,它会把请求交给X.pm去分发.
所以, 在开发阶段为了测试或者调试一般都会使用这个小型的server.
现在我们来运行它: perl x_server.pl
它会在加载Catalyst项目的相关组件跟插件时打印出一大串的信息,这些先不用看, 加载完成后你会看到:
You can connect to your server at http://computername:3000 |
表示它已经启动成功了,现在你可以通过3000号端口来访问它.
假设我们这个项目所在的机器IP为: 192.168.1.1
那么现在我们试着用浏览器访问: http://192.168.1.1:3000/help
你会看到页面上显示了 "What can I do for you?"
恩, 当客户端发起请求时, 请求的URL是: /help
于是X.pm根据这个URL找到了Root.pm里面的 一个名字为help的action来处理这个请求, 这个action做的所有工作就是往响应的主体(body)里面填写一段字符串"What can I do for you?".
同理,如果我们在Root.pm里面写多几个action,名字分别叫 action1, action2, action3, 那么它们分别可以处理这些请求: /action1, /action2, /action3
其实,编写action就是编写函数,只是这个函数跟一般的函数不同,它有一个或者多个属性,我们一般只编写具有一个属性的action, 你可以看到help这个action, 它的属性是Local, 属性跟函数名之间以冒号隔开.action的属性决定了这个action可以处理什么样的URL.
Local这个属性的意思就是说,这个action所能处理的url = action所处的controller的namespace + "/" + action的名字.
help这个action处于Root.pm这个controller里面, 一个controller默认的命名空间是它名字的小写,如果含有冒号则全部以"/"进行替换,
比如
X::Controller::A 它的默认命名空间为 a,
X::Controller::A::B 它的默认命名空间为 a/b,
那么X::Controller::Root它的默认命名空间是 root,
那么help这个action所能处理的URL = root + "/" + help = root/help
但是你在 X::Controller::Root.pm里面看到了这样的一行代码:
__PACKAGE__->config->{namespace} = ''; |
这行代码把X::Controller::Root的命名空间改成了 '',所以,
help这个action所能处理的URL = '' + "/" + help = /help
所以, 我们访问 /help的时候, X.pm会发现help这个action可以处理这样的URL,所以就把这个请求交给了help进行处理.
注意Controller的命名空间我们一般是不做任何修改的, Root.pm进行了修改只是因为它比较特殊.
如果Controller的命名空间不修改的话,根据url跟action的对应关系,从一个url我们就可以看出它应该是哪个Controller的哪个action进行处理.(假设没有多个action对应同一个url的情况)
每个action的第一行代码基本上就是:
my ( $self, $c ) = @_;
这是负责分发请求给action是传进来的参数, $self无特别意义, 指Controller本身的名字而已, $c是Catalyst里面最重要的一个对象.
$c是什么? c是指context上下文的意思.$c它其实是应用程序类的一个对象, 它内部主要包含了以下组成部分:
$c->request : Catalyst::Request对象,用于取得请求中的各种参数
$c->response : Catalyst::Response对象, 是对客户端请求的响应
$c->stash : 一个hash引用,用于Catalyst每个组件或者action之间传递数据 这3个对象的生命周期为一个请求周期,也就是说,在处理每一次客户端请求的时候,这3个对象都会重新生成.
$c->model('Model::DBIC') 可以得到组件(MyApp::Model::DBIC) $c->model('View::TT') 可以得到组件(MyApp::View::TT)
|
在X::Controller::Root.pm里面你还可以看到其他2个action: default跟end,
关于action更详细的讲解,我们会在后面讲到.