ui这一块前台无所谓了,后台grid用着还是很方便的,可以定义字段,可以格式化显示,可以过滤显示等 activeform的话可以绑定验证 ar的优势是可以处理关联,验证 gii甚至能从数据库中读取字段注释作为标题 大致来看yii提供的组件基本上没怎么用,只是用到了基本的mvc功能
1.gii,ui前端这些是yii的一些附加的功能,而不是yii的优势,这些是yii搞的一些脚手架,这些都是为了快速开发而已,你可以根据自己的特点选择用还是不用,或者自己封装,
2.yii强大的地方在于组件,模块,组件的懒加载机制,依赖注入,控制反转等设计模式,migrate,支持composer,多入口模式,以及yii框架支持你重写他的框架底层,另外还有yii的初始化过程允许你嵌入自己的组件,譬如fecshop的store就是在yii初始化过程中执行,yii的哲学特性很符合做可持续升级的产品
ar是用到的,model层就是ar实现,ar也是一个很强的特性,在于抽象,mongodb和mysql的ar,有一些用起来很类似,
撸业务,mvc就够了,做产品不仅仅如此,要照顾很多
代码持续升级,数据库持续升级,修改框架底层,fecshop后期重构底层,解耦合,可扩展,方便重写等等
你说的那些yii强大的地方,只是一些脚手架,fecshop的前端部分,需要非常独立,因为用户可以自己做模板, 因此用户可以不用bootstrap,而yii的这些脚手架都依赖于bootstrap,另外,对于商城,首页,产品,分类,购物车,这些页面gii也造不出来,另外fecshop的模板机制是多模板机制,而且加入了service层,block层,这些yii2默认的都是没有的,gii是没法用的。
提问这个问题,你可以换位思考,写出来你换位思考的想法,你既然有为什么不用的提问,你可以想想,如果用,怎么用呢?能优化那些?有什么好处?
fecshop选择是弃用,yii的这种适合做后台,但是后台我根据需要自己封装的aopadmin,开发起来更快,所以整体弃用了。
yii2强大的地方,在于他的设计模式,譬如行为:http://www.yiichina.com/doc/guide/2.0/concept-behaviors ,对于整页缓存,可以通过行为(Behaviors),很方便的嵌入整页缓存功能, yii2的ActiveRecord同样也很强大,多种数据库,譬如mysql,mongodb,redis都以AR的方式抽象出来,方便使用
另外,yii2的组件异常强大,懒加载模式,非常独立,基于容器注入的方式生成,可以通过配置和class,通过容器生成多个组件,因此session,数据库,等组件解耦的非常好,session可以选择多种底层,可以选择mysql,mongodb,redis,文件等实现,而且是解耦的,我认为封装的非常好
另外,一处封装,多处使用,yii2的user组件,无论是web状态,还是restful模式,都是可以使用的,而且觉察不出来有什么不同,将解耦和通用性做的很好。
yii2的底层编码,读了也不少,了解这个框架后,我就感觉这个就是我想要的框架,yii2将各种编程思想用的很好,代码结构比较扁平化,底层代码易读,还是上面说的,将解耦和通用性做的很好。
fecshop借鉴了很多yii2的思想,譬如service层的实现就是参考的yii2的组件,各个services是解耦独立的
fecshop是多入口模式,多个不同的入口公用services,那么services就要做一系列的封装来满足通用性, 譬如fecshop有web端和基于api的vue端,web端有session,但是api端没有,因此,fecshop封装了session services,也就是:https://github.com/fecshop/yii2_fecshop/blob/master/services/Session.php ,让appserver端(vue的后端入口)也可以像使用php session那样使用,session services可以使用get set方法。
session services
另外fecshop的services层,重构底层非常方便,譬如将cart由mysql数据库换成 redis,我开发了一个fecshop的redis cart扩展:https://github.com/fecshop/yii2_fecshop_redis_cart ,安装配置后,原来cart信息存储到mysql里面,就切换到了存储到redis里面,对于上层代码都是无感知的,这些思想都是取自于yii2的设计思想。
总之,我认为yii2的强大之处在于他的设计模式,而非那些脚手架,即使没有那些脚手架,作为yii2使用者也要有能力针对自己的业务特点,做一系列的封装,做出来快速开发的脚手架。
我用adminlte+kartik-v+gii做过 fecshop好像没有用yii框架下的验证器,而是自己写的验证,按yii的思路去改验证总是找不到地方
比如邮寄地址里面的邮箱,我怀疑只做了前端验证没做后端验证
不需要啰嗦闲扯,你认为有问题,直接上代码说明,拿出来你的论据
这里没有怀疑,只有事实。
yii2的model的验证为什么要用?fecshop的设计是基于services层,services层下面的数据提供者,可以是model,也可以是远程的api,难道一定用yii2的model的验证就是好的?
不要抱着一种先入为主的方式,xx一定要用,这个问题不再继续和你探讨。
无论你想说什么,说出来你的论点的同时,说出来你的论据,不要和我说xx就是这样的,如果以这种描述作为你的论据,本人不做这样的探讨。
那我可以肯定邮寄地址中email地址是没有后端验证的 电话号码和邮政编码前端和后端验证都没有,不过考虑到邮政编码各国格式不一样,验证不好写,但是电话号码还是有统一格式的
如果有这样的问题,你就开新帖,说明具体的bug问题,带上你的论据。
无论你想说明什么问题,带上你自己的观点论据。
使用ar验证与使用Service并不冲突,验证规则是可以脱离model在service中定义的
@hetao [[#9楼](#comment9)](#comment9) 的确是不冲突,model验证只是数据库字段的验证,并不是万能
customer 注册,就是用的model的验证:https://github.com/fecshop/yii2_fecshop/blob/master/models/mysqldb/customer/CustomerRegister.php
有问题你就直接上问题,开新帖,说明你的论据观点
不要在这个帖子下面继续啰嗦,搞的烦。有问题你就直接上问题,拿出来你的论据。
model也并不必须是数据库字段,还可以是任意表单字段,model本来就分ar model和form model
和上面说的一个样,不是万能,form model能判断库存? 库存本身就不是前端传递的数据
form model
如果你是为了用而用的方式讨论这个问题,就不需要讨论了,对于Yii2框架,适合的就用,不适合的就不用,这是我的方式,满足我的需要,解决我的问题即可,怎么方便怎么来。
关于订单的email信息验证这些,我查看了代码,是存在email格式验证问题,这个后面会修正。
鉴于这个问题,后面会把表单部分重新核实一下。
感谢你提出的bug问题,就是这个过程太曲折,耗费大量的时间在这个上面,有问题直接了当的说明论点,展示论据,说明清楚问题,一次说明白,节约彼此的时间
本人是上班族,时间紧张,讨论问题太曲折就会特烦。
订单部分的修正:https://github.com/fecshop/yii2_fecshop/commit/8b9d3310a665fbf912cec99b869a8ffdd0856fbb
后面尽量搞成models rules验证。
感谢你对这个问题的提出!
您好,针对你提出的疑问,我细看了一下,也开始怀疑我当初为什么这样做。
后面慢慢细究出来当时的想法
if (isset($_POST['FormName'])) { $model->attributes = $_POST['FormName']; if ($model->validate()) { if ($model->save()) { // handle success } } }
也就是通过$model->attributes来赋值,然后,进行验证
$model->attributes
但这种方式,需要数据库所有的字段都写到rules()函数里面,否则无法通过$model->attributes = $_POST['FormName'];这种方式来赋值,只能单个属性赋值,进而,fecshop使用了 $model = Yii::$service->helper->ar->save($model, $one);这种方式进行遍历赋值,另外针对多维数据加入了serialize处理 ,当时也是没有绕出来这个固圈,导致当时对其进行了整体抛弃,现在又回去看了一下源码, 这种规则验证还是可以继续用起来的
$model->attributes = $_POST['FormName'];
$model = Yii::$service->helper->ar->save($model, $one);
serialize
// 规则验证 if ($model->validate()) { }
仅仅进行规则验证,其他的保存方式,还是使用$model = Yii::$service->helper->ar->save($model, $one);,因为有的表的字段非常的多,不可能都写到rules里面,如果写到rules里面,那么新加一个字段,都需要写到models的rules里面,会费劲很多,另外,可能多种保存方式做多种rules,就和fecshop中的customer,登录,注册都需要单独写一个model rules,会搞的很重。
因此,将$model->validate()引入进来,models层的rules,只做数据层的验证,保证后端的数据安全,对于form表单的验证,由前面的block完成。不过form表单的很多数据和model层的数据是叠加的。
$model->validate()
总结:将$model->validate()引入进来,做model的rules规则验证,保证最终的数据格式安全。
感谢你的问题提出,后面着重优化一下这块。