觉得yii最强大的地方在于gii,ui,ar,为什么fecshop中都没有有效的利用呢?

文档问题 · hetao · 于 5年前 发布 · 2535 次阅读

ui这一块前台无所谓了,后台grid用着还是很方便的,可以定义字段,可以格式化显示,可以过滤显示等 activeform的话可以绑定验证 ar的优势是可以处理关联,验证 gii甚至能从数据库中读取字段注释作为标题 大致来看yii提供的组件基本上没怎么用,只是用到了基本的mvc功能

共收到 13 条回复
Fecmall#15年前 0 个赞

1.gii,ui前端这些是yii的一些附加的功能,而不是yii的优势,这些是yii搞的一些脚手架,这些都是为了快速开发而已,你可以根据自己的特点选择用还是不用,或者自己封装,

2.yii强大的地方在于组件,模块,组件的懒加载机制,依赖注入,控制反转等设计模式,migrate,支持composer,多入口模式,以及yii框架支持你重写他的框架底层,另外还有yii的初始化过程允许你嵌入自己的组件,譬如fecshop的store就是在yii初始化过程中执行,yii的哲学特性很符合做可持续升级的产品

ar是用到的,model层就是ar实现,ar也是一个很强的特性,在于抽象,mongodb和mysql的ar,有一些用起来很类似,

Fecmall#25年前 0 个赞

撸业务,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方法。

另外fecshop的services层,重构底层非常方便,譬如将cart由mysql数据库换成 redis,我开发了一个fecshop的redis cart扩展:https://github.com/fecshop/yii2_fecshop_redis_cart ,安装配置后,原来cart信息存储到mysql里面,就切换到了存储到redis里面,对于上层代码都是无感知的,这些思想都是取自于yii2的设计思想。

总之,我认为yii2的强大之处在于他的设计模式,而非那些脚手架,即使没有那些脚手架,作为yii2使用者也要有能力针对自己的业务特点,做一系列的封装,做出来快速开发的脚手架。

3楼 已删除.
hetao#45年前 0 个赞

我用adminlte+kartik-v+gii做过 fecshop好像没有用yii框架下的验证器,而是自己写的验证,按yii的思路去改验证总是找不到地方

hetao#55年前 0 个赞

比如邮寄地址里面的邮箱,我怀疑只做了前端验证没做后端验证

Fecmall#65年前 0 个赞

不需要啰嗦闲扯,你认为有问题,直接上代码说明,拿出来你的论据

这里没有怀疑,只有事实。

yii2的model的验证为什么要用?fecshop的设计是基于services层,services层下面的数据提供者,可以是model,也可以是远程的api,难道一定用yii2的model的验证就是好的?

不要抱着一种先入为主的方式,xx一定要用,这个问题不再继续和你探讨。

无论你想说什么,说出来你的论点的同时,说出来你的论据,不要和我说xx就是这样的,如果以这种描述作为你的论据,本人不做这样的探讨。

hetao#75年前 0 个赞

那我可以肯定邮寄地址中email地址是没有后端验证的 电话号码和邮政编码前端和后端验证都没有,不过考虑到邮政编码各国格式不一样,验证不好写,但是电话号码还是有统一格式的

Fecmall#85年前 0 个赞

如果有这样的问题,你就开新帖,说明具体的bug问题,带上你的论据。

无论你想说明什么问题,带上你自己的观点论据。

hetao#95年前 0 个赞

使用ar验证与使用Service并不冲突,验证规则是可以脱离model在service中定义的

Fecmall#105年前 0 个赞

@hetao [[#9楼](#comment9)](#comment9) 的确是不冲突,model验证只是数据库字段的验证,并不是万能

customer 注册,就是用的model的验证:https://github.com/fecshop/yii2_fecshop/blob/master/models/mysqldb/customer/CustomerRegister.php

有问题你就直接上问题,开新帖,说明你的论据观点

不要在这个帖子下面继续啰嗦,搞的烦。有问题你就直接上问题,拿出来你的论据。

hetao#115年前 0 个赞

model也并不必须是数据库字段,还可以是任意表单字段,model本来就分ar model和form model

Fecmall#125年前 0 个赞

和上面说的一个样,不是万能,form model能判断库存? 库存本身就不是前端传递的数据

如果你是为了用而用的方式讨论这个问题,就不需要讨论了,对于Yii2框架,适合的就用,不适合的就不用,这是我的方式,满足我的需要,解决我的问题即可,怎么方便怎么来。

关于订单的email信息验证这些,我查看了代码,是存在email格式验证问题,这个后面会修正。

鉴于这个问题,后面会把表单部分重新核实一下。

感谢你提出的bug问题,就是这个过程太曲折,耗费大量的时间在这个上面,有问题直接了当的说明论点,展示论据,说明清楚问题,一次说明白,节约彼此的时间

本人是上班族,时间紧张,讨论问题太曲折就会特烦。

Fecmall#135年前 0 个赞

订单部分的修正:https://github.com/fecshop/yii2_fecshop/commit/8b9d3310a665fbf912cec99b869a8ffdd0856fbb

后面尽量搞成models rules验证。

感谢你对这个问题的提出!

Fecmall#145年前 0 个赞

您好,针对你提出的疑问,我细看了一下,也开始怀疑我当初为什么这样做。

后面慢慢细究出来当时的想法

 if (isset($_POST['FormName'])) {
         $model->attributes = $_POST['FormName'];
		 if ($model->validate()) {
			 if ($model->save()) {
				 // handle success
			 }
		 }
  }

也就是通过$model->attributes来赋值,然后,进行验证

但这种方式,需要数据库所有的字段都写到rules()函数里面,否则无法通过$model->attributes = $_POST['FormName'];这种方式来赋值,只能单个属性赋值,进而,fecshop使用了 $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的rules规则验证,保证最终的数据格式安全。

感谢你的问题提出,后面着重优化一下这块。

15楼 已删除.
添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics