文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>第三章 掌握Controller 第一节 简介

第三章 掌握Controller 第一节 简介

时间:2007-04-11  来源:xiaoshengcaicai

第一节: Controller简介

上 一章介绍了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;
use strict;
use warnings;
use base 'Catalyst::Controller';

__PACKAGE__->config->{namespace} = '';

sub default : Private {
    my ( $self, $c ) = @_;
    $c->response->body( $c->welcome_message );
}

sub help : Local {
    my ( $self, $c ) = @_;

    $c->response->body( "What can I do for you?" );
}

sub end : ActionClass('RenderView') {}
1;


我们在使用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个对象都会重新生成.



之前提到过, model, view是Catalalyst项目的组件, 那么通过$c可以得到这些组件, 比如

$c->model('Model::DBIC') 可以得到组件(MyApp::Model::DBIC)

$c->model('View::TT') 可以得到组件(MyApp::View::TT)


组件的生命周期并不是一个请求周期,它在整个应用程序一开始时加载进来,在应用程序停止时才进行销毁。



在X::Controller::Root.pm里面你还可以看到其他2个action:  default跟end,
 
关于action更详细的讲解,我们会在后面讲到.
排行榜 更多 +
方块枪战战场安卓版

方块枪战战场安卓版

飞行射击 下载
战斗火力射击安卓版

战斗火力射击安卓版

飞行射击 下载
空中防御战安卓版

空中防御战安卓版

飞行射击 下载