PHP 中什么时候用 component 什么时候用 Model,特别迷惑

开始使用yii2,但是被里面的弄得很迷惑,component和model的区别是什么样的。
以下是一些自己的心得,可能有错误,请指正:
1)发现yii2一些规律,在@app/models/*文件有2种类型。比如InfoForm这样以Form结尾的文件都是继承自Model,而Info.php这样的表名的文件都是继承自ActiveRecord。但疑问的是在github上看到的一些yii2的程序,里面的全部都写在一个Info.php这样的里面。(不过网络上使用yii2开发的开源程序真的是少得可怜,没有研究)
2)component与model的区别到底是在哪里?什么情况下该用component什么情况下该用model?貌似继承自ActiveRecord的Info.php这样的就只是一个单独的这样文件:
phpnamespaceapp\models;
useyii\base\ActiveRecord;
classInfoextendsActiveRecord{
publicfunctionstatictableName(){
return'{{%my_post}}';
}
}
然后就没有写其他的功能代码了,其他的写在这个地方似乎不合适了。
3)接到上面第2点,比如当我要实现用户的积分扣除功能。流程逻辑应该如下吧:
1.先检测用户当前的积分是否充足?如果不充足失败且提示。
2.执行积分扣除
3.成功写入积分变更日志
像第3点这样的,该写在那个文件,特别让人疑惑/models/Member.php还是/models/MemberQuery.php还是/components/Member/ScoresUse.php
4)如果真的像【积分扣除】【用户封禁】这样的功能都制作成单独的组件components,那么ActiveRecordmodels那么岂不就真的就只剩下第2点里面说的这一段内容的?另外如果真的是这样,那岂不component变得异常的庞大,但问题是执行【积分扣除】【用户封禁】这样的操作,不是单独某个表的,如果放到/models/Member.php里面去执行,需要调用额外的其他表,显然又不符合规范,显得很混乱。
5)比如【积分扣除】【用户封禁】这样的操作必须可以让正在登陆用户自行调用,又可以让登陆的管理员自行登陆,所以,似乎归类到model来说完全不适合?归类到component却又还不如直接用function单独函数更方便?比如执行【积分扣除变更】功能:
php/**
*@description操作用户积分!
*@param$mid
*@param$jftype
*@paramstring$tips
*@paramnull$jfValue2
*@returnbool
*/
functionlog_jifen_change($mid,$jftype,$tips='',$jfValue2=null)
{
global$dsql;
$jfvalue=$jfValue2&&is_numeric($jfValue2)?$jfValue2:jifen_value($jftype);
if($dsql->ExecuteNoneQuery2("UPDATE#@__memberSETscores=scores+'$jfvalue'WHEREmid='".$mid."'")){
$rs=$dsql->GetOne("SELECT`scores`FROM`#@__member`WHERE`mid`='{$mid}'");
$scoresLeft=$rs['scores'];
$setarr=array(
'mid'=>$mid,//会员ID
'jftype'=>$jftype,//积分代码
'jftime'=>time(),//操作时间
'jfvalue'=>$jfvalue,//本次变更积分
'tips'=>$tips,//提示内容
'jfleft'=>$scoresLeft,//剩余的积分
);
$dsql->ExecuteNoneQuery("INSERTINTOgk_member_jflogSET".MkSetSql($setarr));
return$scoresLeft;
}
returnfalse;
}
PHP中什么时候该用component什么时候该用model?特别让人迷惑。。。
沧海一幻觉
浏览 435回答 2
2回答

至尊宝的传说

1、当模型本身对应数据库中的表,有数据库查询时继承ActiveRecord(例如User),当本身不涉及到数据库查询时,继承Model(类似LoginForm,它想操作数据只需引用User模型中的方法操作就行,本身不需要)。ActiveRecord继承自Model,扩展了数据库操作的功能。2、Model继承自Component,扩展了规则,场景,验证等功能,感觉model文件夹下的一般都继承model和activerecord就行了吧,没必要继承component3、扣除积分的功能,个人认为应该写在积分model中,对于更复杂的,类似购物流程这个,有人建议再增加一个service层,来处理用到多个model的逻辑。4、5对于组件等只是了解大体原理,没怎么用过,感觉简单的增加积分什么的,用事件只需要在积分model中写入记录时绑定用户model中的修改总积分的事件就可以吧,至于用行为,一般是好多个类通用时才会用到吧。公共的方法类似工具类一般不会涉及到数据库的操作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript