phrame MVC框架学习笔记(一)

来源:互联网 发布:今日api数据预测 编辑:程序博客网 时间:2024/05/16 15:03

 要维护一个使用phrame写的网站,顺带学习一下MVC设计模式。

phrame是一个使用PHP实现的web开发框架,它提供了基本的MVC架构,此外它还提供了一些很有用的基础类,如HashMap, Stack, ArrayList等。Phrame可以从以下地址下载:
http://sourceforge.net/projects/phrame/

phrame的文档很难找,也许是自己搜索时用的关键字有问题,极不容易才找到了phrame user's guide。在看phrame源代码时发现它的注释很像javadoc风格,于是搜索了一下果然找到了phpDoc,用phpDoc从phrame的源代码中生成的文档可以从以下地址下载:
http://download.csdn.net/source/1776647
phrame users guide:
http://phrame.sourceforge.net/docs/guide/guide.php
自己把phrame users guide转载到了博客上,地址:
http://blog.csdn.net/jcwKyl/archive/2009/10/29/4743332.aspx

下面是在google上搜索到的phrame的教程,
phrame tutorial with smarty:
http://wp.uberdose.com/2004/01/25/phrame-tutorial-with-smarty/
phrame tutorial: building the hello application
http://phrame.sourceforge.net/docs/tutorials/hello.php
在phrame的sourceforge网站上还可以下载到它的examples。

由于自己做网站经验极少,对MVC理解很浅。这篇笔记主要通过一个简单的例子讨论phrame的使用。例子来自上面提到的"building the hello application”这篇文章,主要实现的功能是显示一个编辑框由用户输入姓名,然后在用户提交后显示欢迎信息。由于php5中没有XSLT类的函数,所以原文中的view部分使用一般的php代码实现。

原来的例子中总共分六步完成:
Step 1: Directory Structure for Hello Application
Step 2: Building the Models
Step 3: Building the Actions
Step 4: Building the Views
Step 5: Building the Form Objects
Step 6: Piecing Together the Hello Application
这里完全按照原来的例子。
目录结构:
[whb@jcwkyl html]$ tree hello
hello
|-- actions
|-- forms
|-- include
|-- models
`-- views


第二步:构建Models
主要实现Person类,Person类有一个$_name属性,通过Person类的getName()和setName()来操作_name。
文件:models/Person.php

第三步:构建Actions
Action的责任是决定"What to do”,Models的责任是决定"How it is done”,Action是Controller的一部分。在这里主要实现HelloAction类,它从Action中继承,在它的perform()方法中,它从传入的$actionForm参数中取出用户输入的name,然后构造一个Person对象并使用用户的输入来设置该对象的$_name属性,之后把该对象放到SESSION中,从参数$actionMapping中取出转向的URI,返回它。
文件:actions/HelloAction.php

第四步:构建Views
一个是默认显示的index页面,一个是用户提交后显示欢迎信息的hello页面。
文件:views/index.php views/hello.php

第五步:构建Forms
在这一步实现自己的form对象,用户自己的from对象从phrame的ActionForm类继承,phrame的ActionForm从HashMap继承,用户自己实现form对象的主要任务是重载validate()函数,检验用户的输入。
文件:forms/HelloForm.php

第六步:构建Controller
如phrame users guide上的讲解,构建Controller时的主要工作是:对于每一个用户请求URI,保证都已经有一个处理这个URI的Action子类,在这个例子中,惟一的URI就是用户填完name后提交表单,表单的隐含元素action的值是sayHello,我们已经为它写了HelloAction;另一项工作是构建一张映射表,form—action--action forward的映射表。
文件:include/mappings.php include/errorHandler.php  include/options.php phrame.php index.php
其中phrame.php为自举文件(bootstrap file),在这里构建ActionController对象并开始处理请求。
index.php是view handler,在这里主要是定向到views/default.php中去。
options.php指定controller的一些选项,它最后作为ActionController的构造函数的参数。
mappings.php构建映射表,它最后controller的process方法的参数。

源代码和文件目录结构附在了最后。

有两点值得说明:
一:调试时遇到这样的场景,点击OK本来是应该转到views/hello.php页面的,却总是转到错误页面,单步调试发现是因为在HelloAction类的perform实现中$_SESSION[_ERRORS]为真,所以想在那里看看$_SESSION的值,但是因为这个HelloAction.php是纯粹处理后台逻辑的(实际上,它被调用时的堆栈是这个样子:ActionController->process--->ActionController->_processAction--->HelloAction->perform,这可以用xdebug_print_function_stack()函数看出来,也可以使用vim插件+xdebug单步调试看到),所以,在这里使用的var_dump的所有输出都不会在浏览器上被看到,所以,需要把错误信息记录到日志中去,这可以通过error_log来完成。把var_dump的错误存储到字符串中的方法php manul上提到过,网上也能很容易搜索到,代码如下:

二:在mappings.php中_ACTION_FORWARD都是这样写的:

注意到其中的_PATH是views/hello.php?而不是views/hello.php,这个原因可以从ActionController.php中的_processForward的定义看出来:

如果$redirect为0,则会执行header(“Location: $path&”.SID),有个文件a.php,如果$path是"a.php”,那么a.php?&可以被正确访问,a.php&会出现404错误。另外从这里也能看到,$redirect的值决定了$_SESSION是否会被清除,就是phrame users guide中说的"forward on”和"redirect”这两个单词的区别。

另外一点:今天遇到的一个问题,试图把一个对象放到session中去,然后在另一个文件中要从session中把这个对象取出来,结果总是出错,var_dump($_SESSION)看了一下,说是__PHP_Incomplete_Class,这个问题可以在网上搜索到很多讨论,我的解决方法是把那个类定义文件再包含进来。

文件目录结构:
 [whb@jcwkyl html]$ tree hello
hello
|-- actions
|   `-- HelloAction.php
|-- error.php
|-- forms
|   `-- HelloForm.php
|-- include
|   |-- errorHandler.php
|   |-- include.php
|   |-- mappings.php
|   `-- options.php
|-- index.php
|-- models
|   `-- Person.php
|-- phrame.php
`-- views
    |-- default.php
    `-- hello.php

 
5 directories, 12 files

 

源代码可以在http://download.csdn.net/source/1785206找到。

原创粉丝点击