CodeIgniter4和CI3相比,框架更加的厚重丰满了,我不喜欢如此的厚重,显得蠢笨。相对而言还是喜欢CI3的轻量简洁。然而无论是否喜欢,该用还是要用的。
CI4和CI3相比,MVC结构发生了一些变化,多了Entity类,也就是在原来经典的Model、View、Controller的基础上,添加了一个层次,可以说是MEVC结构了。
多出来的这个Entity在我上一个项目的开发时,并没有使用,当时为了追求速度,懒得深入学习、也完全没有时间学习CI4,所以仍然保持着CI3的喜欢进行开发。这是允许的,CI4的文档中也明确的提及:虽然引入了Entity类,然而如果个人习惯使然,可以忽略它继续沿用曾经的MVC模式。
但是这个Entity类的引入实际上是非常实用的,它可以被翻译成“实体类”,但这样翻译稍微有一些晦涩,我更喜欢把它称为“实例类”,虽然我的叫法不标准,但是对自己而言更容易理解一些。
经典的MVC模式中的Model层,也就是模型层,主要是对数据库的操作、将数据库中的数据结构具象成数据模型,方便理解和使用。
然而如果只使用Model类进行数据的具象,有一个比较大的弊端:分不清楚Model中的方法究竟是针对数据表的、还是针对实例对象的。例如下面的代码:
$userInstance = $userModel->fetch(100);
$userInstance->printSelfInfo();
其中fetch()方法和printSelfInfo()方法,都要封装在UserModel中,然而前者是model下面的方法,后者则是model具象出来的具体实例下的方法,二者如果都放在UserModel中,显然会出现下面这个尴尬的情况:
$userModel->printSelfInfo();
这个调用是允许呢?还是不允许呢?显然printSelfInfo()不应该被暴露给类、只应暴露给类实例。这个时候引入的Entity类就解决了上述的尴尬:Model层中的方法都是类方法,而Entity层中的方法都是暴露给实例的方法,也就是Entity相当于是一个实例类,当然官方翻译——他叫实体类。