MVC模式中controller是一个管道,Model是处理器。但是很多时候Controller会需要到不同表的不同内容。这样如果在Model中就会有很多像get_name,get_info,get_id之类的只要一条Query就能完成的功能。感觉很累赘。其实在Controller要用的地方写条Query也就好了,但是这样又破坏了MVC的规则。
现在的想法是把挑出用的多的函数放到Model里面,把零碎的在留在Controller里面。
求各位给点意见撒~
迷茫2017-05-16 17:08:54
其实你说的这个问题很多框架都可以解决,也就是active record功能,也就是根据代码动态生成query语句,它最开始在rails框架里得到推广,并逐步在其他语言里得到实现。比如
$userModel->find_one_by_id(123);
实际上如果你的框架支持active record,像这种简单的根据主键查询,我们是不需要在model里写一行代码的,model基类根据你所调用的方法名,组装成合适query语句,并将查询结果返回给你。
我不知道你使用的是何种语言,但目前基本所有的脚本语言都有active record的实现,你可以在自己的项目中实现这一功能,这样也给后续的开发带来好处。
能在代码中约束的问题,比用一些设计原则约定更加有效,因为你不能保证每个开发者的水平都一致。
迷茫2017-05-16 17:08:54
我不知道ci是如何实现active record的,不过你说的小函数,在许多php的active record实现里面都是使用的魔术方法,或者代码生成器自动帮你生成的,都不用你自己写。
举一个例子,active record在doctrine里面是这样实现的:假如一个表foo,带字段bar1, bar2, bar3,doctrine会根据table schema直接生成四个文件: FooTable.class.php,FooTableBase.class.php,Foo.class.php,FooBase.class.php。在两个base文件里面,会有自动生成的一系列getter和setter比如getBar1(),setBar1($param)这些方法。base文件是不允许程序员自己修改,它会随着schema的改变而变化。而非base类直接继承了base类,所以看上去这个类会干净许多