找找过去的帖子!到www.phpe.net上看看,有一个专题是“分离美工,杜绝重复”=================一代过去,一代又来,地却永远长存。日头出来,日头落下,急归所出之地。
风往南刮,又往北转,不住的旋落,而且返回转行原道,江河都往海里转,海
却不满,江河从何处流,仍归何处。

解决方案 »

  1.   

    具体些:)我们讨论一下怎么样通过Pear实现MVC吧
    我正在做一个使用Pear实现的CMS系统
      

  2.   

    php做不到JAVA那种MVC只能做到美工和程序员的分离用模板做
      

  3.   

    PHP4.3.1的PEAR是集成在内,还是要自己去下?!
      

  4.   

    将系统的设计分为Model模型/逻辑、View视图/界面、Controller控制/流程三个逻辑部分达到良好的项目效果,以此便利各部分开发者的工作并降低日后的维护成本。(如果您熟悉JSP开发的Model 2模式,可以发现它也是MVC模式的很好体现。)就现实的项目开发而言,现存的很大问题包括网页设计人员和程序开发人员的工作交错和冲突以及商业逻辑嵌入页面造成不可重用也很难维护等等。引入MVC模式一方面可以为系统的总体设计指出明确的方向,对于开发团队的分工也是良好的指导。
        既然依照MVC模式要求对系统的总体结构在逻辑上分成三部分,那么团队的开发者中也存在着针对各个部分的开发者。
        网页设计人员 View视图/界面 设计所有用户界面的网页模板。 
        控制流程开发人员 Controller控制/流程 编写系统流程中的所有PHP页面。 
       商业逻辑开发人员 Model模型/逻辑 开发系统设计中规定的各个类(其中的方法)。
      

  5.   

    只要系统设计的好,当然可以做到分离
    Php4.3.1的话,你可以从老版本的php里面获得pear,然后到pear.php.net去一个一个包得下比较新的版本,包括一些新开发出来的包:)
      

  6.   

    用什么技术无所谓,pear只是个类库而已。我们可以通过设置apache的404错误页面的指向,来使得所有url请求全部指向到一个文件。通过分析url,从xml配置文件中得到相应的action,action去得到模板文件做相应处理后,返回给浏览器。这个应该是一个MVC设计的具体实现吧。
      

  7.   

    楼上的办法不好,如果我的项目是没有独立服务器的,只是租用的虚拟主机怎么办?人家会让我改apache设置吗?
    不如做一个单纯的Control页面,剩下的和你说的一样了:)
      

  8.   

    写一个类放在一个php文件中。提供数据库连接,查询,取记录,取字段名称,等的方法(dbclass)。
    把对数据库的操作放到另外一个文件中。这个文件调用数据库的方法都由数据库类(dbclass)提供(servlet),
    把网业做好。里面的表单提交到业务文件中(servlet)
    实现了一个三层的应用
      

  9.   

    to gks_cn(981530) 这也应该是作PHP的一些经验。算准MVC吧,实际的PHP是无法实际MVC的,只能是一定程度上的美工和程序分离,如果仿JAVA的话的SERVLET控制器部分还好说可BEANS那部分怎么办,PHP作不到
      

  10.   

    做了半年php,发觉弱了。
    的确没有java先进。
      

  11.   

    MVC只是一种设计模式,PHP怎么可能无法实现?美工和程序的分离,这个说法太简单啦,我用js去调用php也可以做到分离。可见MVC!=美工和程序分离gks_cn(981530)觉得php弱,是因为你打算让php去干他不应该干的事,当然弱啦。让你去用java写个ping命令,你也会说java弱的。java给人的感觉强,是因为sun一直在领导大家发展java的强项而避免弱项。php给人感觉弱是因为现在太多人之会php(比如从美工过度过来的所谓的程序员),总是试图让php去干他不该干的事。。是吧?
      

  12.   

    php的pear可以实现mvc 不过要适应一段时间~
      

  13.   

    我认为mvc模式不只是为了分离界面和代码,
    他还有个好处是维护和升级方便,java是要编译的,分成mvc模式当然有好处。不过php不是像程序那样编译的,他都是脚本,没有servlet、bean需要编译。
    顶多只需尽量分离界面和代码,并不一定非要mvc,好像只要mc v就差不多了:)
      

  14.   

    vbb基本上是一个分离的系统吧
    页面都模块化,美工可以直接参与
      

  15.   

    在我个人理解来看,将MVC应用到PHP的开发中,其理由不仅仅将代码和HTML分离。
    如果仅仅是要分离PHP代码和HTML,方法很多,也不见得MVC是最好。我感觉将不同工种的人、甚至相同工种的多个人组合在一起进行一个大项目的开发,才是将MVC应用到PHP开发中的重要理由之一。即使是JAVA,我想也不是因为什么编译不编译的问题才去采用MVC的设计模式的吧。
    其理由也应该是我上面所说的大致相同。用MVC的设计模式去开发PHP的Web项目,可以使WebDesigner、Coder、Programmer很好的在一起进行协作开发。同时,相同工种间也可以做到相互不影响,互不干扰(当然,要做到这一点,还得有非常好的前期系统分析、案例分析和系统架构设计等)。
      

  16.   

    php没有严格的象jsp中mvc结构templates 模式或许象点!
      

  17.   

    没有一种语言有现成的结构,都是人设计的。java可以实现structs,php也可以~!偶就实现啦~!
      

  18.   

    你就会说你实现了,但是你是怎样实现的,不拿出一段代码来show show,怎知道你是不是在骗人。
      

  19.   

    我是从JSP转到PHP来的,没办法,为客户着想了,
    客户维护人员不懂JSP(可能没听过),只懂点PHP。个人觉得JSP确实比PHP先进很多,就拿操作数据库来说吧,
    JSP写好的程序只要简单的修改一下连接参数就可以访问不同的
    数据库,而PHP对于不同的数据库的操作方式却千差万别,以前
    用PHP+oracle写的程序,现在要变成PHP+SQLServer都不知道要改
    多少个地方了,这不今天发了一个100分的贴都没人理。MVC用jsp+servlet+javaBean来实现简直太容易了,还有开源的struts用,
    不知PHP能否实现,我也很想知道。
    当然了PHP也有优点,速度比JSP快些,不像JSP有很多乱码问题。
      

  20.   


    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用起来也很有意思的呵。抛砖引玉。欢迎探讨
      

  21.   

    以上就是实现的统一访问入口的问题。以下是另外一些想法如果将html中的变量命名再技巧化。也许你实现数据的验证和sql语句的自动生成就更轻松了。有兴趣的可以试看看:eg: 
        <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.
      

  22.   

    更改一下:
    <input type="button" name="event:User.ChangePassword" value="true"/>

    <input type="Hidden" name="event:User.ChangePassword" value="true"/>此举是进行事件映射.
      

  23.   

    php pear中db库 它是创建数据中间层的 以后换数据库很easy的
      

  24.   

    实际上PHP也有开发好的中间层听过DB或ADODB吗?就是专门跟不同的数据库打交道的,把语句写好,写明是什么类型的database,其余工作就由那个中间层来做,你只要取得返回的结果就行了。但美工和程序分离,PHP确实不太成熟,这是事实,只有想点别的办法来实现了。
      

  25.   

    偶的实现方式跟blstar(阿均) 是基本一致的,通过给index.php(或其他名字)一个固定参数$n来实现向统一入口--index.php发送指令,index.php根据此指令,通过解析web-mappings.xml文件,来得到相应action的名字如首页就是IndexAction.php然后index.php再require这个action做具体逻辑处理,action是通过使用phplib的template类来解析模板文件。blstar(阿均) 在这一步是使用了smarty,就我个人而言,我不是太喜欢smarty的一些处理方式。虽然说smarty功能很强大,但一定程度上把逻辑判断等概念引入到了html中,这样就背离了使用模板的意义:本来用模板就是为了使php代码和html代码(或者说是两种工作)分离开,从而做到在一定程度上相互不影响,而smarty的那部分概念又将html自身的处理复杂化了。我还是觉得phplib或fasttemplate做的比较干脆和单纯,当然,smarty中缓存的概念是相当不错的,偶只玩过,没有真正用在项目中过。
      

  26.   

    konv(烂冬瓜)认为我光说不练,我就把我的index.php贴上来:<?
    //
    // +----------------------------------------------------------------------+
    // | 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;
    }
    ?>
      

  27.   

    做一点说明:
    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)的功能。
      

  28.   

    其实简单的mvc框架实现起来还是很容易的。就是将现在的PHP资源好好整合起来。。其中要考虑的问题就是性能问题smarty也正在学,还不太清楚具体用于项目的效果怎么样。。不过我认为就界面逻辑放在界面处理中还是有一定道理的不要和商业逻辑放在一块。。soniclee可能是参考了一些struts的思想吧看着其极眼熟呵。。
      

  29.   

    > 其实简单的mvc框架实现起来还是很容易的。就是将现在的PHP资源好好整合起来。。> 其中要考虑的问题就是性能问题完全同意。> smarty也正在学,还不太清楚具体用于项目的效果怎么样。。网上已经有些中文写的具体介绍smarty的文章啦,可以看看。
    我一个朋友以smarty为中心做过一个小型网站:jjgod.cnmud.net> 不过我认为就界面逻辑放在界面处理中还是有一定道理的不要和商业逻辑放在一块。。是的,商业逻辑根界面逻辑是要分开,但不能将他与html方在一起,这样又给本身就没有逻辑判断的html硬加上一层逻辑判断,不光有花蛇添足之感,效率也是个问题。
    在做小型甚至部分中型网站时,可以这样,但时企业级的网站开发,如果用这种思想,那不仅会加大后期维护的难度,而且很容易使各工种的工作内容出现混淆。这就完全背离了使用MVC的初衷。> soniclee可能是参考了一些struts的思想吧看着其极眼熟呵。。对啊,我的web-mappings.xml文件就是struts里的,结构都没有改过。呵呵
      

  30.   

    PEAR+PHPLIB实现
    如果简简单单的把mvc理解为分离美工和代码的话  那就太粗浅了
      

  31.   

    MVC模式不应该只是简单的代码和页面分离而应该是代码和页面之间的一种黄金分割用phplib之类的东西,使程序员的负担加重了用Smarty使页面中增加了逻辑判断,把逻辑判断分了部分给美工应该会使开发效率高点下面一个小程序是我用Smarty写的http://www.85j.com/shatan