framework

Yii 2.0 框架学习笔记-基础抽象

Yii 框架从 2.0 开始,底层抽象上面发生了一些变化。比如,多了 DI 和 Service Locator 等设计模式相关的抽象。这两天,专门看了下代码,写下一点我的想法。

上面的图是,是我用 Visual Paradigm 画的类图。从图里我们看到,2.0 版本以来,最根部的抽象是一个叫 Configurable 的接口,其主要作用就是说明所有的类都可以用类似 Key-Value 结构来进行配置。除了一些 Helper 的类,绝大部分对象都是 Configurable 的实现。

打开 Configurable 的代码,发现是一个空的接口,所以,我认为作者这是要表达一种抽象层面的概念,并没有实际的用途。查了 Stack-Overflow ,据说这是原自 Java 里的一种惯用做法,不过说实在的,我还是没有太理解,全空用来表达概念,可能是出于某种性能层面的考虑。但是,读起来确实有点故弄玄虚的错觉。

Keep Reading — 1441 words totally

一眨眼,使用Yii框架已经有两年的历史了。今天,改代码改得郁闷,我来吐吐槽。

Yii框架的官方文档,其实介绍了关于最佳实践的问题。就是Controller里该写些什么,Model里该写些什么,View里该写些什么。但是实际情况到底是怎么一回事呢?

Model,这里应该写什么,按照原有的最佳实践,这里应该实现所有的业务逻辑的。这个毋庸置疑。但是,Yii框架干了很浑的一个事情,就是做了一个ActiveRecord的东西,然后,各种案例教学,一搞Model这个问题的时候,好像就在讲这个AR怎么个好法。然后Model莫名其妙就跟DB搞一起了。然后大家就习惯性的提到Model总想到DB,再然后,Model就成了一个DB接口一样的东西。注意到这里的心态转变没有,Model跟业务逻辑的关系被淡化了。事实上,像我这样的公司,都不允许在Web服务器上连接DB,必须透过中间件,结果Model就惨了,彻底沦为了访问中间件的接口封装层。然后到底该如何实现业务逻辑呢?实现到什么粒度算是实现了业务逻辑呢?这个根本没有给出一个指导。比如,创建用户这个业务。你可以在Model里实现一个addUser的方法,把所有事情都做了。你也可以实现一个addUser,checkExist,sendEmail,然后在Controller里 if ($m->checkExist() && $m->addUser()) { $m->sendEmail() },你看,这到底算不算把业务逻辑写在了Model里呢?前一种,addUser在内部做完所有的事情,后一种,实现了三个子操作,在Controller里组装。前一种,Controller里干净了,就一行代码,但是复用性极差,因为别的场景,比如从文件向空DB导入用户的时候,就没必要sendEmail和checkExist,就无法复用第一种的代码,第二种的相对细粒度的,就容易复用。不是都说代码复用么,blahblah……结果人们很有很强的动力用第二种。但是,检查存在性,然后写入存储,最后发邮件,这个事情到底是不是业务呢?所以,Model里实现粒度的指导,至关重要。结果根本没有任何指导。最后,Model的实现,被彻底原子化了,而且粒度切分,按照个人的习惯而定,有的粗,有的细,最后,Controller就很恐怖地容纳了巨量的业务逻辑。

Keep Reading — 1312 words totally