从DB::到C::看dz2.5的变革--Discuz…

前言:本文对普通的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类也因此变得很局限,对于二次开发扩展来说,不太有利。当然,官方自己开发的话不会存在局限一说,毕竟需要什么方法自己添就是了,只是会出现很多重复代码而已。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值