zf工作流程

来源:互联网 发布:剑网三谢云流捏脸数据 编辑:程序博客网 时间:2024/04/29 04:53

Zend_Controller是使用MVC模式来构建一个站点的基础。Zend_Controller体系是一个轻量的,模块化和可扩展的体系。它只提供最核心的必要的部分,允许开发者有很大的自由来灵活地构建自己的站点。使用Zend_Controller的站点,其文件组织和代码结构会比较相似。

Zend_Controller 的工作流(workflow)是通过几个组件来实现的。虽然不需要完全理解这几个组件的含义,如果你对工作流程有点了解是很有帮助的。

Zend_Controller_Front是Zend_Controller_Controller体系的组织者,它是FrontController设计模式的实现。Zend_Controller_Front处理服务器接受的所有请求,并最后负责将请求分配给各个ActionController(Zend_Controller_Action)

Zend_Controller_Request_Abstract用于处理用户请求,提供各种类方法来设置和获得Controller和action的名称及各种请求的参数。另外,它可以跟踪其中的action是否已经被Zend_Controller_Dispatcher分配。本抽象类的子类可用于封装整个请求环境,允许router从中获取用户请求相关信息,或设置controller和action的名称。

Zend Framework默认使用Zend_Controller_Request_Http类来处理用户请求,该类可用于访问HTTP请求相关信息(用户请求不一定通过HTTP,那么就需要你自己实现相关的类–Haohappy注),

Zend_Controller_Router_Interface用于定义router。路由是将检查用户请求并决定由哪一个controller,和其中哪一个 Action来接受请求的过程。request对象中的Controller,action和可选的参数将被Zend_Controller_Dispatcher处理。路由只发生一次:当请求被服务器接收到时,在分配到第一个控制器之前。 (所谓router,和我们熟知的网络路由器的功能是很相似的,具有判断网络地址和选择路径的功能,这里就是用来定位到某个控制器中的某个方法 –Haohappy注)

默认的router是Zend_Controller_Router,它将一个Zend_Controller_Request_Http指定的URI分解成controller,action和参数。例如:URLhttp://localhost/foo/bar/key/value将被分解成foo controller, bar action,并带有参数key,参数值为value.

Zend_Controller_Dispatcher_Interface接口用于定义dispatcher(分配器,或称调度器、派遣器等)。 “分配”是指从request对象中获取controller和action的名称,并映射到controller文件/类及其中action类方法的过程。如果controller或action不存在,会将请求分配到默认的控制器和方法进行处理。

实际上分配过程包括初始化controller类和调用类方法。和路由不一样,路由只发生一次,而分配是一个循环发生的过程。如果request对象的分配状态被重设为false,则循环就会重复,调用request中设置的方法。如果request对象的分配状态被设置成true,则分配过程结束。

默认的dispatcher是Zend_Controller_Dispatcher。它规定了控制器类命名首字母大写,并以Controller结尾,而action方法则是首字母小写,以Action结尾,例如: SomeFooController::barAction. 在例子中,控制器是somefoo,而action是bar.

另外,在加载一个控制器的时候,你可以指定一个module(模块)。有了module,我们可以将controller放在一个子目录中,而不用全部放在controllers目录下。要使用module,可以在front controller中设置参数 useModules: 
$front->setParam(‘useModules’, true); 
举个例子,看下面的URL: 
http://example.com/user/news/action

在上面的例子中,我们指定了’user’模块,并调用其中的news控制器。dispatcher会将其解释成User_NewsController类,并在User/NewsController.php文件中寻找该类。

Module非常有用,当你想把代码分散到子目录中去的时候,或者使用第三方代码时,或者在不同的应用中重用相同的控制器时。

Zend_Controller_Action是最基本的控制器。每个具体的控制器都是从Zend_Controller_Action类继承而来,是Zend_Controller_Action的子类,并且有自己的action方法。

Zend_Controller_Response_Abstract定义了基础的响应类,用于收集并返回action的响应,包括响应的头部(header)和主体(body),由于它使用了 __toString()方法,所以可以直接用echo来一次性输出所有header和内容。

默认的响应类是Zend_Controller_Response_Http,它很适合于HTTP环境下使用。

Zend_Controller的工作流程相当简单。Zend_Controller_Front接收一个请求,然后由Zend_Controller_Router来决定分配给哪个controller。Zend_Controller_Router把URI分解,便于设定请求中的controller和action的名称。Zend_Controller_Front接着进入一个分配循环,调用Zend_Controller_Dispatcher,把dispatcher传给request,来调用请求中指定的具体的(或默认的)controller和action进行处理。在controller结束后,又把控制权交加给 Zend_Controller_Front。如果controller发现需要调用另一个controller(request的分配状态被清零),循环会一直继续直到另一次分配执行完毕。