Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

从DB::到C::看dz2.5的变革--Discuz! X2.5二次开发关于数据库访问的变化

[复制链接]
magicmeteor 发表于 2012-4-22 21:52:53 | 显示全部楼层 |阅读模式
本帖最后由 magicmeteor 于 2012-4-22 22:35 编辑

前言:本文对普通的dz使用用户或者站长帮助不大,因为这部分朋友只需要关注功能上面的变化,无需知道底层代码结构的事情,请忽略跳过。
如果是已经或者想要对dz进行二次开发或者组件开发的朋友们应该有所体会,不妨共同探讨一下这次2.5带来的变化。

ps:类似这样的文章,我竟然找不到发布的版本,只能发这里了。

dz出来2.5版本之后,一直没时间去升级,好像也没有看到哪里有关于这次升级所带来变化的详细介绍。
这两天终于抽出时间去升级了,因为我对dz做了一些二次开发,所以不会像普通用户那样简单的覆盖,所以做了一次代码比对。发现这次升级底层代码的写法确实有了很大的变化,或者说更像OOP了,在架构上更接近4层的MVC了。
其中对大的变化就是在架构中增加了一层,也就是所谓的DAO层。也许单纯PHP开发的朋友,对DAO或者所谓的OOP之类的词语比较陌生。估计对MVC之类的会熟悉一些。

MVC(Model View Controller):模型(model)-视图(view)-控制器(controller)。MVC本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。(本描述来自百度)
目前MVC架构不管是在哪个技术体系都是非常流行的。例如java的SSH(Struts + Spring + Hibernate),.NET的ASPNET MVC Framework,PHP的Zend framework等框架都被广泛应用。随着技术的日益成熟,MVC架构已经不再是表面上的3层结构了,在模型(model)层都会被细分,最常见的是分为Service层和DAO层。(其实DAO层下面还有一个数据库连接层,这一层是与数据打交道的,在java体系里面一般使用Hibernate来实现)

而在dz里面,同样使用了MVC架构。

View层:用于给用户展示以及与用户交换的部分,一般来说指的是html展示部分。dz使用了模板引擎来实现,也就是代码里面的template方法。具体可以参考function_core.php文件里面的template方法。

Controller层:一般是负责具体的业务模块流程的控制,相当于一个摆渡的作用。在dz里面就是根目录的那些文件。如index.php,home.php,forum.php等文件,他们都没有实际的业务逻辑,仅仅是用来控制流程。说白了就是通过它知道你发出的请求应该调用哪个类或者哪个方法来进行处理。

Service层:主要负责业务模块的逻辑应用的,也就是具体要进行操作的一些业务逻辑处理。在dz里面就是/source/module/里面的文件。当然,根据业务逻辑的复杂程度,不仅限于这个目录里面的方法,dz还根据实际的需要和功能抽象出class、include、language等公用或者特殊的类和方法。

DAO层:主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此。一般来说DAO层的类相当于一个实体对象,与数据库表一一对应的。在dz里面就是/source/class/table里面的文件,应该是与数据库表一一对应的(具体没有详细对应去看)。在调用的时候,使用C::t('对象名称')来调用获得DAO对象,例如C::t('common_member'),则可以获得common_member的DAO对象,而该对象对应的方法则可在table_common_member.php里面进行定义。以前的版本是没有这一层的,是直接通过DB::query等数据库操作直接查询数据的,有了DAO层,在业务逻辑操作的时候更加体验了面向对象的思想。如果对dz进行的二次开发的朋友,肯定已经发现了这个变化,在业务逻辑代码里面,所有的DB::XXX的方式都换成了C::XXX。当然,dz还是保留DB::XXX等方法的使用,不过对于二次开发的话,不建议直接使用DB::XXX而是调用C::XXX。

但是这个版本的仍有美中不足的地方。虽然实现了DAO层来实现面向对象的手段,但是并没有吸收到DAO层的精华所在。因为我发现所有的table类竟然是独立的,很多公用的方法例如fetch_by_uid,fetch_all_by_uid等等通用的增删查改,都没抽取出来放到父类里面去。所以导致很多重复的代码,而且table类也因此变得很局限,对于二次开发扩展来说,不太有利。当然,官方自己开发的话不会存在局限一说,毕竟需要什么方法自己添就是了,只是会出现很多重复代码而已。

评分

2

查看全部评分

sw08 发表于 2012-4-22 23:18:40 来自手机 | 显示全部楼层
现在一个数据表要建一个类,反正我是特别不习惯。这种模式初衷是好的,但是真的会增加开发时间和代码量。所以目前我还是用原来的
回复

使用道具 举报

 楼主| magicmeteor 发表于 2012-4-22 23:49:14 | 显示全部楼层
sw08 发表于 2012-4-22 23:18
现在一个数据表要建一个类,反正我是特别不习惯。这种模式初衷是好的,但是真的会增加开发时间和代码量。所 ...

嗯,那是因为没有抽象出父类的原因,如果抽象出了父类,基本的增删查改就不需要自己写方法,这个对于新增表是非常方便的。现在只能说dz已经开始有这样的思想,但是做法还不够成熟。
回复

使用道具 举报

朝天阙 发表于 2012-4-23 01:35:32 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

sjn610 发表于 2012-4-23 01:41:22 | 显示全部楼层
学习......
回复

使用道具 举报

腐朽的木头 发表于 2012-4-23 09:29:05 | 显示全部楼层
占位围观
回复

使用道具 举报

范海平 发表于 2012-4-23 10:32:01 | 显示全部楼层
magicmeteor 发表于 2012-4-22 23:49
嗯,那是因为没有抽象出父类的原因,如果抽象出了父类,基本的增删查改就不需要自己写方法,这个对于新增 ...

抽象父类更好的,得依赖于php的更新的版本,比如php5.3.
dz2.5现有的这种方式还是不错的,我挺喜欢的
回复

使用道具 举报

hjyy 发表于 2012-4-23 10:37:05 | 显示全部楼层
总体来说,你觉得X2.5的性能比X2高多少?
回复

使用道具 举报

 楼主| magicmeteor 发表于 2012-4-23 11:00:07 | 显示全部楼层
hjyy 发表于 2012-4-23 10:37
总体来说,你觉得X2.5的性能比X2高多少?

才刚刚更新上去,不敢妄下定论啊~~~貌似之前做的插件都失效了,还得一一改出来。
回复

使用道具 举报

hjyy 发表于 2012-4-23 11:01:33 | 显示全部楼层
magicmeteor 发表于 2012-4-23 11:00
才刚刚更新上去,不敢妄下定论啊~~~貌似之前做的插件都失效了,还得一一改出来。

一一改出来是什么意思啊,就是重新安装一下插件吗?那样也还可以接受,不会不能用了吧?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-23 11:01 , Processed in 0.035664 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表