找找过去的帖子!到www.phpe.net上看看,有一个专题是“分离美工,杜绝重复”=================一代过去,一代又来,地却永远长存。日头出来,日头落下,急归所出之地。
风往南刮,又往北转,不住的旋落,而且返回转行原道,江河都往海里转,海
却不满,江河从何处流,仍归何处。
风往南刮,又往北转,不住的旋落,而且返回转行原道,江河都往海里转,海
却不满,江河从何处流,仍归何处。
我正在做一个使用Pear实现的CMS系统
既然依照MVC模式要求对系统的总体结构在逻辑上分成三部分,那么团队的开发者中也存在着针对各个部分的开发者。
网页设计人员 View视图/界面 设计所有用户界面的网页模板。
控制流程开发人员 Controller控制/流程 编写系统流程中的所有PHP页面。
商业逻辑开发人员 Model模型/逻辑 开发系统设计中规定的各个类(其中的方法)。
Php4.3.1的话,你可以从老版本的php里面获得pear,然后到pear.php.net去一个一个包得下比较新的版本,包括一些新开发出来的包:)
不如做一个单纯的Control页面,剩下的和你说的一样了:)
把对数据库的操作放到另外一个文件中。这个文件调用数据库的方法都由数据库类(dbclass)提供(servlet),
把网业做好。里面的表单提交到业务文件中(servlet)
实现了一个三层的应用
的确没有java先进。
他还有个好处是维护和升级方便,java是要编译的,分成mvc模式当然有好处。不过php不是像程序那样编译的,他都是脚本,没有servlet、bean需要编译。
顶多只需尽量分离界面和代码,并不一定非要mvc,好像只要mc v就差不多了:)
页面都模块化,美工可以直接参与
如果仅仅是要分离PHP代码和HTML,方法很多,也不见得MVC是最好。我感觉将不同工种的人、甚至相同工种的多个人组合在一起进行一个大项目的开发,才是将MVC应用到PHP开发中的重要理由之一。即使是JAVA,我想也不是因为什么编译不编译的问题才去采用MVC的设计模式的吧。
其理由也应该是我上面所说的大致相同。用MVC的设计模式去开发PHP的Web项目,可以使WebDesigner、Coder、Programmer很好的在一起进行协作开发。同时,相同工种间也可以做到相互不影响,互不干扰(当然,要做到这一点,还得有非常好的前期系统分析、案例分析和系统架构设计等)。
客户维护人员不懂JSP(可能没听过),只懂点PHP。个人觉得JSP确实比PHP先进很多,就拿操作数据库来说吧,
JSP写好的程序只要简单的修改一下连接参数就可以访问不同的
数据库,而PHP对于不同的数据库的操作方式却千差万别,以前
用PHP+oracle写的程序,现在要变成PHP+SQLServer都不知道要改
多少个地方了,这不今天发了一个100分的贴都没人理。MVC用jsp+servlet+javaBean来实现简直太容易了,还有开源的struts用,
不知PHP能否实现,我也很想知道。
当然了PHP也有优点,速度比JSP快些,不像JSP有很多乱码问题。
jsp和php都用过一些。对这个话题比较有兴趣。
也正在研究之中..
用jsp做过一个oa系统,自己写的框架,基本实现mvc方式, 一个control servlet实现请求分析,然后call相应的类。现在jsp有很多这方面的工程:struts , turbine+velocity .... php也可以实现的,个人建议使用如下:model: php中的类封装商业代码. 数据访问建立使用 adodb(正在使用,觉得不错,一个仿m$ ado的php库,目前最新为3.7),它提供一个统一的访问接口,支持N种数据库,楼上的可以去参考一下. http://php.weblogs.com/ADODBview: 建议使用 smarty , 一种模板语言,我也正在学习。简单一些可使用fastTemplate.control: 这个自己写. 一般为index.php ,在其中做到分析请求. 其实在cgi 1.1标准中都有一个PATH_INFO的东东。。可以实现统一访问.
在jsp中和php中都有.
举个例子:
实现用户登录: call的URL为 : http://..../index.php/User/Login
在index简单实现的control为:
<? $action = explode('/', $_SERVER['PATH_INFO']);
if(count($action) == 3) //分解后的数组有三个值:第一个为空,第二个为User第三个为Login
{
$className = "C" . $action[1];
$methodName = $action[2]; //调入相应的class,此例为CUser.php
require_once($className . ".php");
//实例化该类
if(class_exists($className)) //如果类定义存在
{
$classInstance = new $className();
if(method_exists($classInstance, $methodName))
$classInstance->$methodName(); //到此就完成了相关的调用工作。
} ?>以上只是简单的几句就实现了将path映射成相关的类的调用。。由于有众多的公共变量可以用,可以实现数据的分离. 再将模板和数据访问好好封装一下。我相信实现起来会更加有趣和方便建立各位多看看国外好的php程序. 发觉PHP用起来也很有意思的呵。抛砖引玉。欢迎探讨
<input type="text" name="data:User.Name" />
<input type="text" name="data:User.Password" />
<input type="button" name="event:User.ChangePassword" value="true"/>我的意思就是:
在自己的control(也可以在基类中实现)中进行数据整理。 将$HTTP_POST_VARS中以上的值进行分解,前面加上data和event的意思就是区分传递过去让分析器自己分解和实例相关的类和函数。然后再进行必要的逻辑验证,也可以写一个通用的filter工具放在control中,实现配置就可以实现参数的验证.呵呵 这样就将html中的东东直接映射给class了,数据是数据,w就是: Browser (View) --------> Controller -------> Model (Class) <------> DB
| |
/|\ |
| Template
| |
| ------------------------|再control处实现variants的整理和验证并完成类的实例和函数的调用。再将处理的结果call相关的template.
<input type="button" name="event:User.ChangePassword" value="true"/>
为
<input type="Hidden" name="event:User.ChangePassword" value="true"/>此举是进行事件映射.
//
// +----------------------------------------------------------------------+
// | D6Web Applications |
// +----------------------------------------------------------------------+
// | Copyright (c) 2002-2003 |
// +----------------------------------------------------------------------+
//
// $Id: index.php,v 1.2 2003/07/02 01:42:43 rui.li Exp $
//
include_once("./conf/global.inc.php");include_once("./ext/Loader/Loader.php");$_Loader = new Loader (array (
"ext" => _EXT_PATH, // Extension Libraries from Internet
"pear" => _PEAR_PATH, // PHP's PEAR Libraries
"act" => _ACTION_PATH, // Actions of this Web
));$_Loader->import("pear.DB");
$_Loader->import("ext.function");
$_Loader->import("ext.CGI.*");
$_Loader->import("ext.XML.XML");$n = $_GET['n'];if (empty($n))
$n = "index";//echo $n;$uri = $_SERVER['REQUEST_URI'];
//echo $uri;
//echo "<br><hr><br>";$db = DB::connect($_DB_DSN);if (! is_object ($db) || DB::isError($db)) {
echo '<h1>Database Error!</h1>';
exit;
}$cgi = new CGI;
$extras = $cgi->parseUri();//**********************************************************
//分析配置文件
//echo $cgi->page;
$xml = new XML(_ACTION_XML);
$actions = $xml->evaluate("//action-mappings/action");
foreach($actions as $ac) {
$action = $xml->get_attributes($ac);
if($action["path"] == $n) {
$forwards = $xml->evaluate($ac."/forward");
$forward_names = array();
$forward_paths = array();
$actionstr = $action["type"];
$forward = $forward["name"];
$xslpath = $forward["path"];
foreach($forwards as $forward) {
$forward_attr = $xml->get_attributes($forward);
$arr_paths = array($forward_attr['name'] => $forward_attr['path']);
}
}
}
if($actionstr != "") {
//echo $actionstr;
$_Loader->import ("act.".$actionstr);
$action = new $actionstr($db,$cgi);
$action->run();
// echo $action->test();
}else {
f_jumpURL("html/404.html");
exit;
}
?>
Loader.php是网上的一个叫saf的开源项目中的一个文件,其文件包含的处理做的比较出色,偶就拿来啦,用起来感觉跟java的import差不多。CGI类则是用来处理通过post或get方式发送过来http请求。
此类会将请求的中变量参数做转换:
http://xxx/index.php?x=5
转换后,在具体action中(如IndexAction.php)是这样用的:
$cgi->x = 5;数据库的操作我选用了现在比较热门pear。
pear在我的系统中,除了DB这个大块,还用到了其中文件上传(HTTP/Upload.php)和翻页(Pager.php)的功能。
我一个朋友以smarty为中心做过一个小型网站:jjgod.cnmud.net> 不过我认为就界面逻辑放在界面处理中还是有一定道理的不要和商业逻辑放在一块。。是的,商业逻辑根界面逻辑是要分开,但不能将他与html方在一起,这样又给本身就没有逻辑判断的html硬加上一层逻辑判断,不光有花蛇添足之感,效率也是个问题。
在做小型甚至部分中型网站时,可以这样,但时企业级的网站开发,如果用这种思想,那不仅会加大后期维护的难度,而且很容易使各工种的工作内容出现混淆。这就完全背离了使用MVC的初衷。> soniclee可能是参考了一些struts的思想吧看着其极眼熟呵。。对啊,我的web-mappings.xml文件就是struts里的,结构都没有改过。呵呵
如果简简单单的把mvc理解为分离美工和代码的话 那就太粗浅了